[导入]关于怎样通过xslt向.NET扩展函数传递OuterXml属性
2005-03-09 17:02
351 查看
根据我以前对这个系统的描述,比如选择题,在试题的配置文件中存在差不多是以下的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
这样就实现了操作xmlNode的功能
想要使用这个xslt扩展,只要通过AddExtensionObject添加到transform就可以了,比如:
XsltArgumentList xslArg = new XsltArgumentList();
Run obj = new Run();
xslArg.AddExtensionObject("urn:WebExam", obj);
xslt.Transform(doc,xslArg,Response.Output,null);
<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
这样就实现了操作xmlNode的功能
想要使用这个xslt扩展,只要通过AddExtensionObject添加到transform就可以了,比如:
XsltArgumentList xslArg = new XsltArgumentList();
Run obj = new Run();
xslArg.AddExtensionObject("urn:WebExam", obj);
xslt.Transform(doc,xslArg,Response.Output,null);
相关文章推荐
- 关于C# Windows Forms 怎样通过用窗体类的this.Handle属性得到的IntPtr在别处的类中将此IntPtr还原为刚刚那个窗体类的实例,即(this).
- 笔记:javascript通过反射和遍历,访问对象的所有属性,及 按引用/按值传递
- 关于WPF的两个窗口之间通过创建和读取txt传递数据【附源代码】
- Quartz使用二 通过属性传递数据
- react路由的使用方法以及通过路由如何传参传递私有属性--【基于最新版本的react-router-dom(4.2.2)】
- 怎样通过Parcelable来传递Collection
- 关于通过DDMS向Android系统的模拟器的sdcard中导入mp3文件的问题
- 怎样将excel中的数据通过PL/SQL导入ORACLE数据库中
- 属性参数(通过self.进行访问的)进行传递值时,不用再本类中进行初始化。
- 怎样将excel中的数据通过PL/SQL导入ORACLE数据库中
- 关于项目文件导入打开报:无法识别元素 <Target> 中的属性“Returns”错误解决方法
- [导入]关于XMLHttpRequest对象的responseText属性
- 在AO+VC中怎样使通过属性查找到的图元结果在地图上不断的闪烁
- 如何将传递节点设置为通过使用 Visual C#.NET 内联 XSLT 脚本函数
- 一道关于反射的面试题(通过反射修改父类私有属性)
- [导入]关于xslt中current()和(.)的区别
- FusionCharts通过属性link向JavaScript函数传递中文参数导致乱码的解决方法
- 关于后台数据库正常存储中文通过Ajax方式传递到前台变成问号的处理
- 关于mysql中怎样导入.sql文件
- FusionCharts通过属性link向JavaScript函数传递中文参数导致乱码的解决方法