// see http://www.w3.org/TR/xslt#function-element-available
        private bool ElementAvailable(string qname)
        {
            string name, prefix;

            PrefixQName.ParseQualifiedName(qname, out prefix, out name);
            string ns = this.manager.ResolveXmlNamespace(prefix);

            // msxsl:script - is not an "instruction" so we return false for it.
            if (ns == Keywords.s_XsltNamespace)
            {
                return(
                    name == Keywords.s_ApplyImports ||
                    name == Keywords.s_ApplyTemplates ||
                    name == Keywords.s_Attribute ||
                    name == Keywords.s_CallTemplate ||
                    name == Keywords.s_Choose ||
                    name == Keywords.s_Comment ||
                    name == Keywords.s_Copy ||
                    name == Keywords.s_CopyOf ||
                    name == Keywords.s_Element ||
                    name == Keywords.s_Fallback ||
                    name == Keywords.s_ForEach ||
                    name == Keywords.s_If ||
                    name == Keywords.s_Message ||
                    name == Keywords.s_Number ||
                    name == Keywords.s_ProcessingInstruction ||
                    name == Keywords.s_Text ||
                    name == Keywords.s_ValueOf ||
                    name == Keywords.s_Variable
                    );
            }
            return(false);
        }
            public override object Invoke(XsltContext xsltContext, object[] args, XPathNavigator docContext)
            {
                XsltCompileContext xsltCompileContext = (XsltCompileContext)xsltContext;
                ArrayList          ResultList = new ArrayList();
                string             local, prefix;

                PrefixQName.ParseQualifiedName(ToString(args[0]), out prefix, out local);
                string            ns = xsltContext.LookupNamespace(prefix);
                XmlQualifiedName  qname = new XmlQualifiedName(local, ns);
                XPathNodeIterator it = args[1] as XPathNodeIterator;

                if (it != null)
                {
                    while (it.MoveNext())
                    {
                        xsltCompileContext.FindKeyMatch(qname, it.Current.Value, ResultList, docContext);
                    }
                }
                else
                {
                    xsltCompileContext.FindKeyMatch(qname, ToString(args[1]), ResultList, docContext);
                }

                return(new XPathArrayIterator(ResultList));
            }
示例#3
0
文件: compiler.cs 项目: ydunk/masters
        internal XmlQualifiedName CreateXmlQName(string qname)
        {
            string prefix, local;

            PrefixQName.ParseQualifiedName(qname, out prefix, out local);

            return(new XmlQualifiedName(local, this.scopeManager.ResolveXmlNamespace(prefix)));
        }
        // see: http://www.w3.org/TR/xslt#function-function-available
        private bool FunctionAvailable(string qname)
        {
            string name, prefix;

            PrefixQName.ParseQualifiedName(qname, out prefix, out name);
            string ns = LookupNamespace(prefix);

            if (ns == Keywords.s_MsXsltNamespace)
            {
                return(name == f_NodeSet);
            }
            else if (ns == string.Empty)
            {
                return(
                    // It'll be better to get this information from XPath
                    name == "last" ||
                    name == "position" ||
                    name == "name" ||
                    name == "namespace-uri" ||
                    name == "local-name" ||
                    name == "count" ||
                    name == "id" ||
                    name == "string" ||
                    name == "concat" ||
                    name == "starts-with" ||
                    name == "contains" ||
                    name == "substring-before" ||
                    name == "substring-after" ||
                    name == "substring" ||
                    name == "string-length" ||
                    name == "normalize-space" ||
                    name == "translate" ||
                    name == "boolean" ||
                    name == "not" ||
                    name == "true" ||
                    name == "false" ||
                    name == "lang" ||
                    name == "number" ||
                    name == "sum" ||
                    name == "floor" ||
                    name == "ceiling" ||
                    name == "round" ||
                    // XSLT functions:
                    (s_FunctionTable[name] != null && name != "unparsed-entity-uri")
                    );
            }
            else
            {
                // Is this script or extention function?
                object extension;
                return(GetExtentionMethod(ns, name, /*argTypes*/ null, out extension) != null);
            }
        }
        private String FormatNumber(double value, string formatPattern, String formatName)
        {
            string ns = string.Empty, local = string.Empty;

            if (formatName != null)
            {
                string prefix;
                PrefixQName.ParseQualifiedName(formatName, out prefix, out local);
                ns = LookupNamespace(prefix);
            }
            DecimalFormat formatInfo    = this.processor.RootAction.GetDecimalFormat(new XmlQualifiedName(local, ns));

            if (formatInfo == null)
            {
                if (formatName != null)
                {
                    throw new XsltException(Res.Xslt_NoDecimalFormat, formatName);
                }
                formatInfo = new DecimalFormat(new NumberFormatInfo(), '#', '0', ';');
            }

            int[]            groupsize  = { ValidateFormat(ref formatPattern, formatInfo, value < 0) };
            NumberFormatInfo numberInfo = formatInfo.info;

            numberInfo.NumberGroupSizes = groupsize;
            String result               = value.ToString(formatPattern, numberInfo);

            if (formatInfo.zeroDigit != '0')
            {
                StringBuilder builder        = new StringBuilder(result.Length);
                int           startingLetter = Convert.ToInt32(formatInfo.zeroDigit) - Convert.ToInt32('0');;
                for (int i = 0; i < result.Length; i++)
                {
                    if (result[i] >= '0' && result[i] <= '9')
                    {
                        builder.Append((char)(Convert.ToInt32(result[i]) + startingLetter));
                    }
                    else
                    {
                        builder.Append(result[i]);
                    }
                }
                result = builder.ToString();
            }
            return(result);
        }
示例#6
0
 void NameTest(String name, Compiler compiler)
 {
     if (name == "*")
     {
         return;
     }
     if (name.EndsWith(":*"))
     {
         if (!PrefixQName.ValidatePrefix(name.Substring(0, name.Length - 3)))
         {
             throw XsltException.InvalidAttrValue(compiler.Input.LocalName, name);
         }
     }
     else
     {
         string prefix, localname;
         PrefixQName.ParseQualifiedName(name, out prefix, out localname);
     }
 }
        private String SystemProperty(string qname)
        {
            String result = String.Empty;

            string prefix;
            string local;

            PrefixQName.ParseQualifiedName(qname, out prefix, out local);

            // verify the prefix corresponds to the Xslt namespace
            string urn = LookupNamespace(prefix);

            if (urn == Keywords.s_XsltNamespace)
            {
                if (local == "version")
                {
                    result = "1";
                }
                else if (local == "vendor")
                {
                    result = "Microsoft";
                }
                else if (local == "vendor-url")
                {
                    result = "http://www.microsoft.com";
                }
            }
            else
            {
                if (urn == null && prefix != null)
                {
                    // if prefix exist it has to be mapped to namespace.
                    // Can it be "" here ?
                    throw new XsltException(Res.Xslt_InvalidPrefix, prefix);
                }
                return(String.Empty);
            }

            return(result);
        }
示例#8
0
        private XmlDataType ParseDataType(string value, InputScopeManager manager)
        {
            if (value == null)  // Avt is not constant, or attribute wasn't defined
            {
                return(XmlDataType.Text);
            }
            if (value == Keywords.s_Text)
            {
                return(XmlDataType.Text);
            }
            if (value == Keywords.s_Number)
            {
                return(XmlDataType.Number);
            }
            String prefix, localname;

            PrefixQName.ParseQualifiedName(value, out prefix, out localname);
            manager.ResolveXmlNamespace(prefix);
            if (prefix == String.Empty && !this.forwardCompatibility)
            {
                throw XsltException.InvalidAttrValue(Keywords.s_DataType, value);
            }
            return(XmlDataType.Text);
        }
示例#9
0
 internal void SetQName(string qname)
 {
     PrefixQName.ParseQualifiedName(qname, out Prefix, out Name);
 }