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