[导入]关于怎样通过xslt向.NET扩展函数传递OuterXml属性
??? 根據我以前對這個系統的描述,比如選擇題,在試題的配置文件中存在差不多是以下的xmlNode
??? 在通過xslt轉換的時候,我期望將question的OuterXml作為.NET語言的函數參數去處理,該.NET函數分析此question節點并根據設置從數據庫中取出數據,并返回。
??? 可是我在網上找了兩天,都沒有找到相關的東西,并且在網上有很多人說是應該不能實現,本來在網上有一種說法,說是用如下方法:
????????????????xmlns:msxsl="urn:schemas-microsoft-com:xslt"
????????????????xmlns:user="http://mycompany.com/mynamespace"
????????????????version="1.0">
??<msxsl:script?language="JScript"?implements-prefix="user">
????function?xml(nodelist)?{
??????return?nodelist.nextNode().xml;
????}
??</msxsl:script>
??
??<xsl:template?match="/">
????<xsl:value-of?select="user:xml(.)"/>
??</xsl:template>
</xsl:stylesheet>
?
可是我測試沒有成功,提示說:
??? 詳細信息: Microsoft.JScript.JScriptException: 應輸入函數
后來又從網上找了相關資料,好像說在.NET中不能使用,所以我只能放棄這個方法(主要是我實在沒有時間研究了,呵呵),后來我終于“曲線救國”,通過一個變態的方法解決了這個問題,方法如下(本人不能確認這是比較好的方法,僅作參考用,有什么好的辦法也可以提供給我,謝謝)
在我的xslt文件部分代碼如下(原理就是通過xslt對xml的轉換迭代過程將xml節點內容一個一個發送給xslt擴展):
<!--開始接收節點-->
?<xsl:value-of?disable-output-escaping="yes"?select="WebExam:StartSetting(name(.))"/>
<!--發送節電的所有內容-->
?<xsl:apply-templates?select="@*?|?node()"/>
<!--完成結點內容發送并運行該擴展函數-->
?<xsl:value-of?disable-output-escaping="yes"?select="WebExam:GetResult()"/>
</xsl:template>
?
<!--發送所需節點下的人以子節點-->
<xsl:template?match="/exam/questionGroups/*//*">
<!--開始一個節點發送-->
?<xsl:value-of?disable-output-escaping="yes"?select="WebExam:SendElement(name(.))"/>
<!--發送節點內容-->
?<xsl:apply-templates?select="@*?|?node()?|?text()"/>
<!--完成發送該節點-->
?<xsl:value-of?disable-output-escaping="yes"?select="WebExam:EndElement()"/>
</xsl:template>
??
<!--發送節點或子節點中的文本內容-->
??<xsl:template?match="/exam/questionGroups/*//text()">
??<xsl:value-of?disable-output-escaping="yes"?select="WebExam:SetElementValue(string(.))"/>
??</xsl:template>
??
<!--發送節點或子節點的屬性-->
??<xsl:template?match="/exam/questionGroups/*//@*">
????<xsl:value-of?disable-output-escaping="yes"?select="WebExam:SendAttribute(name(.),string(.))"/>
??</xsl:template>
在我的.NET中,用來作為xslt擴展的對象為(將從xslt發送的內容還原成一個節點):
?
public?class?Run{
?XmlDocument?xmlDocument=new?XmlDocument();
//xmlNode表示發送過來的根節點,xmlNode表示當前操作的節點
?XmlNode?xmlNode,xmlNode1;
//開始接受節點數據
?public?void?StartSetting(string?elementName)
?{
??xmlNode=xmlDocument.CreateElement(elementName);
??xmlNode1=xmlNode;
?}
//開始接收一個節點,以后接收的屬性和子節點都將附加到這個新節點
?public?void?SendElement(string?elementName)
?{
??XmlNode?n=xmlDocument.CreateElement(elementName);
??xmlNode1.AppendChild(n);
??xmlNode1=n;
?}
//開始接收一個節點,以后接收的屬性和子節點都將附加到這個節點的父節點
?public?void?EndElement()
?{
??xmlNode1=xmlNode1.ParentNode;
?}
//接收和附加一個屬性
?public?void?SendAttribute(string?Name,string?Value)
?{
??XmlAttribute?xmlAttribute=xmlDocument.CreateAttribute(Name);
??xmlAttribute.Value=Value;
??xmlNode1.Attributes.Append(xmlAttribute);
?}
//接收和附加一個文本內容
?public?void?SetElementValue(string?text)
?{
??xmlNode1.InnerText=text;
?}
?public?string?GetResult()
?{
/**//*
-----------------在這兒對節點進行操作---------------------
*/
??return?xmlNode.OuterXml;
?}
}
??? 這樣就實現了操作xmlNode的功能
??? 想要使用這個xslt擴展,只要通過AddExtensionObject添加到transform就可以了,比如:
?Run?obj?=?new?Run();
?xslArg.AddExtensionObject("urn:WebExam",?obj);
?xslt.Transform(doc,xslArg,Response.Output,null);
總結
以上是生活随笔為你收集整理的[导入]关于怎样通过xslt向.NET扩展函数传递OuterXml属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 调试了半天,全都是复制代码惹得祸!
- 下一篇: [Eclipse]GEF入门系列(七、X