做网站发布,wordpress tag超链接,青岛做一个网站多少钱,如何备份网站来源#xff1a;在.NET里用XSLT时怎么使用msxsl:script #xff08;思归呓语#xff09; 今天在CSDN论坛上看到一个网友在请教关于msxsl:script的用法。感觉这问题也许有点意思#xff0c;所以在下面简述一下。 在MSXML里#xff0c;你在msxsl:script里可以使用Javascript…来源在.NET里用XSLT时怎么使用msxsl:script 思归呓语 今天在CSDN论坛上看到一个网友在请教关于msxsl:script的用法。感觉这问题也许有点意思所以在下面简述一下。 在MSXML里你在msxsl:script里可以使用Javascript和VBScript参考 msxsl:script Element 但在.NET里你只能使用那些.NET支持的语言包括C#VB.NETJScript等。 譬如我们想在XSLT里计算下面这个XML里people的和 root people1/people people2/people people3/people people4/people/root 我们可以使用象这样的XSLT xsl:stylesheet version1.0 xmlns:xslhttp://www.w3.org/1999/XSL/Transformxsl:output methodtext / xsl:template match/ sum:xsl:value-of selectsum(root/people)//xsl:template /xsl:stylesheet 在MSXML和浏览器里我们也可以这么做 xsl:stylesheet version1.0 xmlns:xslhttp://www.w3.org/1999/XSL/Transform xmlns:msxslurn:schemas-microsoft-com:xslt xmlns:useranything here xsl:output methodtext / msxsl:script languageJavaScript implements-prefixuser![CDATA[ function sum(nodelist) { var d 0; var node nodelist.nextNode(); while (node ! null) { d parseInt(node.text); node nodelist.nextNode(); } return d; }]]/msxsl:script xsl:template match/ sum:xsl:value-of selectuser:sum(root/people)//xsl:template /xsl:stylesheet 但如果你在.NET下使用上述XSLT的话你就会得到下列错误 Unhandled Exception: System.Xml.Xsl.XsltException: Function user:sum() has failed. --- System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. --- Microsoft.JScript.JScriptException: Function expectedFunction expected at Microsoft.JScript.LateBinding.Call(Binder binder, Object[] arguments, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters, Boolean construct, Boolean brackets, VsaEngine engine) at Microsoft.JScript.LateBinding.Call(Object[] arguments, Boolean construct,Boolean brackets, VsaEngine engine) at Microsoft.Xslt.CompiledScripts.JScript.ScriptClass_1.sum(Object nodelist).... 为什么因为在MSXML里nodelist这个nodeset参数是个IXMLDOMNodeList实例其nextNode方法返回一个IXMLDOMNode实例。 而.NET则把这个nodeset参数映射到了System.Xml.XPath.XPathNodeIterator或其子类的实例(至于其他的Mapping请参考XSLT Stylesheet Scripting using msxsl:script或后面提到的Aaron Skonnard的文章)。实际上如果你运行上述转换的话你看到的是XPathQueryIterator类。但不管如何在.NET下你只能使用.NET下的类而不能使用那些跟MSXML有关的类/方法譬如 xsl:stylesheet version1.0 xmlns:xslhttp://www.w3.org/1999/XSL/Transform xmlns:msxslurn:schemas-microsoft-com:xslt xmlns:useranything here xsl:output methodtext / msxsl:script languageJavascript implements-prefixuserfunction getType(nxpni){ return nxpni.GetType().Name;} function sum(nxpni){ var d 0; while (nxpni.MoveNext()) d Convert.ToInt32(nxpni.Current.Value); return d;}/msxsl:script xsl:template match/ type:xsl:value-of selectuser:getType(.)/ sum:xsl:value-of selectuser:sum(root/people)//xsl:template /xsl:stylesheet 当然你也可使用C# xsl:stylesheet version1.0 xmlns:xslhttp://www.w3.org/1999/XSL/Transform xmlns:msxslurn:schemas-microsoft-com:xslt xmlns:useranything here xsl:output methodtext / msxsl:script languageC# implements-prefixuserstring getType(XPathNodeIterator nxpni){ return nxpni.GetType().Name;} int sum(XPathNodeIterator nxpni){ int d 0; while (nxpni.MoveNext()) d Convert.ToInt32(nxpni.Current.Value); return d;}/msxsl:script xsl:template match/ type:xsl:value-of selectuser:getType(.)/ sum:xsl:value-of selectuser:sum(root/people)//xsl:template /xsl:stylesheet Aaron Skonnard在MSDN杂志上的专栏《The XML Files 》里对此曾有专述 Extending XSLT with JScript, C#, and Visual Basic .NET 如果你想在XSLT里使用.NET下的扩展函数的话参考微软Dare Obasanjo在MSDN上的Extreme XML专栏 EXSLT Meets XPath