在.NET里用XSLT时怎么使用msxsl:script
來源:在.NET里用XSLT時怎么使用msxsl:script?(思?xì)w囈語)
今天在CSDN論壇上看到一個網(wǎng)友在請教關(guān)于msxsl:script的用法。感覺這問題也許有點(diǎn)意思,所以在下面簡述一下。
在MSXML里,你在msxsl:script里可以使用Javascript和VBScript,參考
<msxsl:script> Element
但在.NET里,你只能使用那些.NET支持的語言,包括C#,VB.NET,JScript等。
譬如,我們想在XSLT里計算下面這個XML里people的和,
<root>
? <people>1</people>
? <people>2</people>
? <people>3</people>
? <people>4</people>
</root>
我們可以使用象這樣的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="/">
?? sum:<xsl:value-of select="sum(root/people)"/>
</xsl:template>
</xsl:stylesheet>
在MSXML和瀏覽器里,我們也可以這么做,
<xsl:stylesheet version="1.0"
????? xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
????? xmlns:msxsl="urn:schemas-microsoft-com:xslt"
????? xmlns:user="anything here">
<xsl:output method="text" />
<msxsl:script language="JavaScript" implements-prefix="user">
<![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 select="user: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 expected
Function 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參數(shù)是個IXMLDOMNodeList實例,其nextNode方法返回一個IXMLDOMNode實例。
而.NET則把這個nodeset參數(shù)映射到了System.Xml.XPath.XPathNodeIterator或其子類的實例(至于其他的Mapping,請參考XSLT Stylesheet Scripting using <msxsl:script>或后面提到的Aaron Skonnard的文章)。實際上,如果你運(yùn)行上述轉(zhuǎn)換的話,你看到的是XPathQueryIterator類。但不管如何,在.NET下,你只能使用.NET下的類,而不能使用那些跟MSXML有關(guān)的類/方法,譬如
<xsl:stylesheet version="1.0"
????? xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
????? xmlns:msxsl="urn:schemas-microsoft-com:xslt"
????? xmlns:user="anything here"
>
<xsl:output method="text" />
<msxsl:script language="Javascript" implements-prefix="user">
function 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 select="user:getType(.)"/>
?? sum:<xsl:value-of select="user:sum(root/people)"/>
</xsl:template>
</xsl:stylesheet>
當(dāng)然你也可使用C#
<xsl:stylesheet version="1.0"
????? xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
????? xmlns:msxsl="urn:schemas-microsoft-com:xslt"
????? xmlns:user="anything here"
>
<xsl:output method="text" />
<msxsl:script language="C#" implements-prefix="user">
string 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 select="user:getType(.)"/>
?? sum:<xsl:value-of select="user:sum(root/people)"/>
</xsl:template>
</xsl:stylesheet>
Aaron Skonnard在MSDN雜志上的專欄《The XML Files 》里對此曾有專述
Extending XSLT with JScript, C#, and Visual Basic .NET
如果你想在XSLT里使用.NET下的擴(kuò)展函數(shù)的話,參考微軟Dare Obasanjo在MSDN上的Extreme XML專欄
EXSLT Meets XPath
轉(zhuǎn)載于:https://www.cnblogs.com/Daview/archive/2004/05/18/10105.html
總結(jié)
以上是生活随笔為你收集整理的在.NET里用XSLT时怎么使用msxsl:script的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于客户端用ASP参生报表
- 下一篇: 第三章 匿名方法