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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

[导入]关于怎样通过xslt向.NET扩展函数传递OuterXml属性

發布時間:2025/7/14 asp.net 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [导入]关于怎样通过xslt向.NET扩展函数传递OuterXml属性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??? 根據我以前對這個系統的描述,比如選擇題,在試題的配置文件中存在差不多是以下的xmlNode

<question?sql="select?***"><title>選擇題題干</title></question>


??? 在通過xslt轉換的時候,我期望將question的OuterXml作為.NET語言的函數參數去處理,該.NET函數分析此question節點并根據設置從數據庫中取出數據,并返回。
??? 可是我在網上找了兩天,都沒有找到相關的東西,并且在網上有很多人說是應該不能實現,本來在網上有一種說法,說是用如下方法:

<xsl:stylesheet?xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
????????????????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:template?match="/exam/questionGroups/*">
<!--開始接收節點-->
?
<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就可以了,比如:

?XsltArgumentList?xslArg?=?new?XsltArgumentList();
?Run?obj?
=?new
?Run();
?xslArg.AddExtensionObject(
"urn:WebExam"
,?obj);
?xslt.Transform(doc,xslArg,Response.Output,
null);

總結

以上是生活随笔為你收集整理的[导入]关于怎样通过xslt向.NET扩展函数传递OuterXml属性的全部內容,希望文章能夠幫你解決所遇到的問題。

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