根据我以前对这个系统的描述,比如选择题,在试题的配置文件中存在差不多是以下的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属性相关推荐

  1. Kotlin-简约之美-进阶篇(十):扩展函数和扩展属性

    文章目录 扩展函数和扩展属性的实现 为什么要用扩展函数和扩展属性 学习交流 扩展函数给本来单薄的类添加了许多功能,今天我们来详细看一下扩展函数和扩展属性到底是什么,应该怎么用. 扩展函数和扩展属性的实 ...

  2. SAP ABAP实用技巧介绍系列之 ABAP XSLT 使用attribute增加新的属性

    Created by Jerry Wang on Jul 01, 2014 用于测试的xml: <catalog> <cd> <title>Empire Burle ...

  3. QT使用xsl将xml为html,使用xslt 2.0将属性设置为根元素(Puting attributes to the root-element with xslt 2.0)...

    使用xslt 2.0将属性设置为根元素(Puting attributes to the root-element with xslt 2.0) 是否可以使用xslt 2.0将xml:lang或lan ...

  4. kotlin学习笔记——扩展函数(anko)和网络请求

    anko是一个强大的库,主要目的是替代以前xml的方式来使用代码生成布局.除此之外,也包含了很多有帮助的函数和属性.本章因为内容需要先介绍其中的扩展函数,其他的我们后面章节再来介绍. anko的git ...

  5. 面向对象的 XSLT编程

    面向对象的 XSLT编程 内容: 样本应用程序的概述 样式表组件的设计 XSLT文档组装器的实现 实例 总结 参考资料 关于作者 在 XML & Web 服务专区还有: 教学 工具与产品 所有 ...

  6. XSL 转换:XSLT 可缓和 XML 架构的不相容性问题[网淘]

    XSL 转换:XSLT 可缓和 XML 架构的不相容性问题 发布日期: 4/14/2004| 更新日期: 4/14/2004 Don Box,Aaron Skonnard,John Lam 本文假设您 ...

  7. Rafy 框架 - 大批量导入实体

    某些场景下,开发者希望能够大批量地把实体的数据导入到数据库中.虽然使用实体仓库保存实体列表非常方便,但是其内部实现机制是一条一条的保存到数据库,当实体的个数较多时,效率就会很低.所以 Rafy 设计了 ...

  8. Python如何导入自己编写的py文件

    一. 想要实现的效果 新建文件夹将自编模块集中管理 可在其它py文件内import 自编模块,像import第三方库一样 二. 实现的方法 步骤1:将编号的模块 *.py放入文件夹,在我计算机中是:F ...

  9. maven工程导入项目打开404_Maven依赖配置和依赖范围

    教程前面用坐标一一对应地描述了构件,并且保存在仓库中了.那用坐标描述好后,把它们放在仓库中的作用是什么呢?当其他项目需要在这些构件的基础上做开发的时候,用户就没必要自己再重新实现一遍了.直接指定坐标, ...

最新文章

  1. Linux操作系统下 NAND FLASH驱动程序框架
  2. spring webmvc使用ResponseBody前,在配置文件中的配置
  3. python mvc web_浅谈python_web的MVC和MTV
  4. day05python
  5. 数字电子技术基础第三版杨志忠_阎石数字电子技术基础第6版笔记和课后习题详解...
  6. 云计算设计模式(五)——计算资源整合模式
  7. 开始把其他的博客搬家到这里了
  8. 单片机音频谱曲软件_【自己写的小软件】CLY单片机音乐代码超级生成器
  9. Java中调用文件中所有bat脚本
  10. 嵌入式Linux的QT版本,嵌入式Linux版本Qt5.4快速部署
  11. 黑白琴键 java_黑白琴键
  12. 电脑排行榜笔记本_热门笔记本电脑排行榜推荐_windows7教程
  13. GPS导航电文编码与校验
  14. MD5加密算法特点及简单实现(Java)
  15. go语言实现家庭收支记账本
  16. linux中vim编译器中复制粘贴,编辑器 - 如何从(并复制到)系统剪贴板进行vim粘贴?...
  17. vue 根据身份证号获取出生年月,性别,年龄
  18. 推荐基于4G模块打造的超低功耗4G摄像头通讯板
  19. 一样的操作,同样的引入,爆红:can’t resolve symbol
  20. YOLOv3 ubuntu 配置及训练自己的VOC格式数据集

热门文章

  1. js改变iframe链接
  2. 关机相关(shutdown,reboot)
  3. 关于Python类属性与实例属性的讨论
  4. 国际化(1)---JS文件国际化
  5. ASP.NET的SEO:使用.ashx文件——排除重复内容
  6. python OOP (1)
  7. 渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(上)
  8. bzoj 4832 抵制克苏恩
  9. H5新特性 input type=date 在手机上默认提示显示无效解决办法
  10. LuManager使用中典型问题整理集合