日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

在.NET里用XSLT时怎么使用msxsl:script

發布時間:2025/3/14 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在.NET里用XSLT时怎么使用msxsl:script 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:在.NET里用XSLT時怎么使用msxsl:script?(思歸囈語

今天在CSDN論壇上看到一個網友在請教關于msxsl:script的用法。感覺這問題也許有點意思,所以在下面簡述一下。

在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參數是個IXMLDOMNodeList實例,其nextNode方法返回一個IXMLDOMNode實例。

而.NET則把這個nodeset參數映射到了System.Xml.XPath.XPathNodeIterator或其子類的實例(至于其他的Mapping,請參考XSLT Stylesheet Scripting using <msxsl:script>或后面提到的Aaron Skonnard的文章)。實際上,如果你運行上述轉換的話,你看到的是XPathQueryIterator類。但不管如何,在.NET下,你只能使用.NET下的類,而不能使用那些跟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">
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>

當然你也可使用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下的擴展函數的話,參考微軟Dare Obasanjo在MSDN上的Extreme XML專欄

EXSLT Meets XPath

轉載于:https://www.cnblogs.com/Daview/archive/2004/05/18/10105.html

總結

以上是生活随笔為你收集整理的在.NET里用XSLT时怎么使用msxsl:script的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。