在.NET里用XSLT时怎么使用msxsl:script

来源:在.NET里用XSLT时怎么使用msxsl:script (思归呓语

今天在CSDN论坛上看到一个网友在请教关于msxsl:script的用法。感觉这问题也许有点意思,所以在下面简述一下。

在MSXML里,你在msxsl:script里可以使用Javascript和VBScript,参考

<msxsl:script> Element

但在.NET里,你只能使用那些.NET支持的语言,包括C#,VB.NET,JScript等。

譬如,我们想在XSLT里计算下面这个XML里people的和,

<root>
  <people>1</people>
  <people>2</people>
  <people>3</people>
  <people>4</people>
</root>


我们可以使用象这样的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />

<xsl:template match="/">
   sum:<xsl:value-of select="sum(root/people)"/>
</xsl:template>

</xsl:stylesheet>

在MSXML和浏览器里,我们也可以这么做,

<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:msxsl="urn:schemas-microsoft-com:xslt"
      xmlns:user="anything here">

<xsl:output method="text" />

<msxsl:script language="JavaScript" implements-prefix="user">
<![CDATA[
   function sum(nodelist)
   {
      var d = 0;
      var node = nodelist.nextNode();
      while (node != null)
      {
  d += parseInt(node.text);
  node = nodelist.nextNode();
      }

      return d;
   }
]]>
</msxsl:script>

<xsl:template match="/">
  sum:<xsl:value-of select="user:sum(root/people)"/>
</xsl:template>

</xsl:stylesheet>

但如果你在.NET下使用上述XSLT的话,你就会得到下列错误:

Unhandled Exception: System.Xml.Xsl.XsltException: Function 'user:sum()' has failed. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> Microsoft.JScript.JScriptException: Function expected
Function expected
   at Microsoft.JScript.LateBinding.Call(Binder binder, Object[] arguments, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters, Boolean construct, Boolean brackets, VsaEngine engine)
   at Microsoft.JScript.LateBinding.Call(Object[] arguments, Boolean construct,Boolean brackets, VsaEngine engine)
   at Microsoft.Xslt.CompiledScripts.JScript.ScriptClass_1.sum(Object nodelist)
....

为什么?因为在MSXML里,nodelist这个nodeset参数是个IXMLDOMNodeList实例,其nextNode方法返回一个IXMLDOMNode实例。

而.NET则把这个nodeset参数映射到了System.Xml.XPath.XPathNodeIterator或其子类的实例(至于其他的Mapping,请参考XSLT Stylesheet Scripting using <msxsl:script>或后面提到的Aaron Skonnard的文章)。实际上,如果你运行上述转换的话,你看到的是XPathQueryIterator类。但不管如何,在.NET下,你只能使用.NET下的类,而不能使用那些跟MSXML有关的类/方法,譬如

<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:msxsl="urn:schemas-microsoft-com:xslt"
      xmlns:user="anything here"
>

<xsl:output method="text" />

<msxsl:script language="Javascript" implements-prefix="user">
function getType(nxpni)
{
  return nxpni.GetType().Name;
}

function sum(nxpni)
{
  var d = 0;
  while (nxpni.MoveNext())
 d += Convert.ToInt32(nxpni.Current.Value);

   return d;
}
</msxsl:script>


<xsl:template match="/">
   type:<xsl:value-of select="user:getType(.)"/>
   sum:<xsl:value-of select="user:sum(root/people)"/>
</xsl:template>

</xsl:stylesheet>

当然你也可使用C#

<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:msxsl="urn:schemas-microsoft-com:xslt"
      xmlns:user="anything here"
>

<xsl:output method="text" />

<msxsl:script language="C#" implements-prefix="user">
string getType(XPathNodeIterator nxpni)
{
  return nxpni.GetType().Name;
}

int sum(XPathNodeIterator nxpni)
{
  int d = 0;
  while (nxpni.MoveNext())
 d += Convert.ToInt32(nxpni.Current.Value);

   return d;
}
</msxsl:script>


<xsl:template match="/">
   type:<xsl:value-of select="user:getType(.)"/>
   sum:<xsl:value-of select="user:sum(root/people)"/>
</xsl:template>

</xsl:stylesheet>

Aaron Skonnard在MSDN杂志上的专栏《The XML Files 》里对此曾有专述

Extending XSLT with JScript, C#, and Visual Basic .NET

如果你想在XSLT里使用.NET下的扩展函数的话,参考微软Dare Obasanjo在MSDN上的Extreme XML专栏

EXSLT Meets XPath

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

绕过waf mysql爆库_iwebsec刷题记录-SQL注入漏洞

被推荐了这个web平台&#xff0c;感觉挺适合新手的&#xff0c;网上搜了下没看到有人写wp&#xff0c;这里本入门萌新来稍微整理下自己解题的过程SQL注入漏洞01-数字型注入http://localhost:32774/sqli/01.php?id1发现有报错You have an error in your SQL syntax; check the …

【Vue】组件的基础与组件间通信

转载&#xff1a;https://segmentfault.com/a/1190000016409329 Vue.js 最核心的功能就是组件&#xff08;Component&#xff09;&#xff0c;从组件的构建、注册到组件间通信&#xff0c;Vue 2.x 提供了更多方式&#xff0c;让我们更灵活地使用组件来实现不同需求。 一、构建组…

java 自定义map_自定义写实现java中map中的功能(简易)

package test;/*** 通过自定义来实现一个map功能* 存放键值对&#xff0c;根据键对象找到一个值对象&#xff0c;确保没有重复*/import java.util.Map;public class test01 {SxtEntry[] arrnew SxtEntry[990];int size;//定义函数实现将键值对放入数组public void put(Object k…

设计模式的功力长了!

今天醒来后&#xff0c;感觉理解了原来比较复杂的一些设计模式&#xff0c;很好&#xff0c;就像小时候感觉长高一样。学习设计模式有一年多了。进步需要时间&#xff01;

java 验证码校验_JavaWeb验证码校验功能代码实例

后台生成验证码工具方法/** 设置图片的背景色*/public static void setBackGround(Graphics g, int WIDTH, int HEIGHT) {// 设置颜色g.setColor(Color.WHITE);// 填充区域g.fillRect(0, 0, WIDTH, HEIGHT);}/** 设置图片的边框*/public static void setBorder(Graphics g, int…

如何做不浮躁的人

51CTO著名专家老刘&#xff0c;连发了两篇博文&#xff0c;老刘的博客http://2844337.blog.51cto.com/ 都是劝谏我们年轻人不要浮躁。两篇文章用故事教育我们一定不要浮躁&#xff0c;但是如何做到不浮躁&#xff0c;老刘没有说。我想借着这个主题&#xff0c;简单谈一下自己的…

hasset java_java HashSet的使用

今天在写代码时想要使用HashSet&#xff0c;由于之前并不了解&#xff0c;就在网上查了一下原理及使用方法。HashSet原理该类实现了Set接口&#xff0c;HashSet中不允许元素重复&#xff0c;不保证集合中元素的顺序&#xff0c;元素可为null&#xff0c;但最多只能一个。对于 H…

Oracle tips

存储过程无法编译和抛掉&#xff01;&#xff01;我在一个项目组中与同事一起开发存储过程&#xff0c;碰到过其他人在调试存储过程时&#xff0c;我无法编译同一个存储过程的问题。但是&#xff0c;现在我使用pl/sql dev将其他的进程都杀掉后&#xff0d;&#xff0d;包括在调…

TCP拥塞控制机制

为了防止网络的拥塞现象&#xff0c;TCP提出了一系列的拥塞控制机制。最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion avoidance)”组成&#xff0c;后来TCP Reno版本中又针对性的加入了“快速重传(Fast retransmit)”…

java中类似sort_java中的Sort函数,你值得看

基于C语言中的sort如此这么方便&#xff0c;自然而然&#xff0c;java中也有类似C的sort函数。1.普通数组&#xff1a;Arrays.sort(数组名&#xff0c;开始位置&#xff0c;结束位置)。2.类中属性排序&#xff1a;模板&#xff1a;class A{int n;}class cmp implement Comparat…

明天启程去北京:)

去北京参加为期5天的微软sps培训&#xff0c;公司穷呀&#xff0c;所以只能做火车去了&#xff0c;17日下午到达北京&#xff0c;18日&#xff0d;22日5天培训&#xff0c;23日到青岛&#xff0c;呆两三天然后26日下午回家&#xff1a;&#xff09;有北京和青岛的朋友可以联系我…

多线程java 银行_Java 多线程 之 银行ATM实例

package com.thread;import java.util.Scanner;public class TestBank {public static void main(String[] args) {Bank bank new Bank();Thread lingming new Thread(bank, "李明");Thread wangtao new Thread(bank, "王涛");lingming.start();try {Th…

CSDN登陆校验码模式识别程序

下班后&#xff0c;吃饭前快速写了这么一个东西&#xff0c;以证明图片验证码的脆弱。防君子&#xff0c;不防XX。本来应该使用HTTP协议直接从CSDN的登陆页面DOWN校验图片的&#xff0c;因为时间仓促&#xff0c;所以没有仔细设计。只是做一个示例&#xff0c;还要麻烦大家手工…

C语言中整形数组、字符数组、字符串的区别

一、 第一 整型数组的存放&#xff0c;数组最后是不加\0的&#xff0c;字符串会自动加上&#xff0c;因此存放字符的时候数组的大小要比实际字符的多一个 第二 整型数组 每一个单元是4个字节的&#xff0c;字符串是一个一个字符存放的&#xff0c;每个字符占一个 二&#xff0c…

java hibernate 表关联_Hibernate多表关联

一、多对一进行关联(多个学生对应同一间宿舍)---学生是主体&#xff0c;宿舍是附体&#xff0c;关联关系在主体学生中设置&#xff0c;在学生类中设置宿舍类&#xff0c;由于宿舍类只有一个可以直接用类来设置,在映射学生类(User)中包含宿舍这个类(Room),在映射配置文件(User.h…

getchar、putchar、puts、gets

getchar(字符) 输入获取一个字符 putchar(字符) 输出控制台一个字符 scanf&#xff08;&#xff09;格式化输入 printf&#xff08;&#xff09; 格式化输出 gets(arr) 输入一个字符串给已经声明的数组arr puts(字符串或者字符数组名&#xff09;输出一个字符串 转载于:https…

关于异性朋友

听到别人在问一个问题&#xff1a;“可是你在大学里又有几个很要好的女性朋友&#xff1f;”   想到自己&#xff0c;却是一个没有。奇怪啊&#xff0c;我虽然木讷&#xff0c;但还不到白痴的地步&#xff0c;怎么会一个没有呢&#xff1f;思讨一下&#xff0c;明白了&#…

java全文检索工具_全文检索工具elasticsearch:第三章: Java程序中的应用

搭建模块创建二个项目gmall-list-service的appliction.properties:server.port8073spring.datasource.urljdbc:mysql://localhost:3306/gmall?characterEncodingUTF-8spring.datasource.usernamerootspring.datasource.passwordrootmybatis.configuration.map-underscore-to-c…

win10 多用户登陆

win10 多用户登陆 一般的直接下载就可以用了。 核心参考链接github 支持 1903 支持最新版本可以需要这个1903支持项参考页面 上述页面的下载文件页面1903支持页面 关于上述链接下载文件readme的解释 RDP Wrapper Library Updater --------------------------- <Add support …

DNN(DotNetNuke)注册用户终于突破10万人了,其3.0也终于跳票了...

是的&#xff0c;尽管我很不愿意&#xff0c;但的确是跳票了&#xff0c;或许跳票是软件开发的惯例了。据说会在圣诞节那天发布&#xff0c;也可能是月底&#xff0c;没有人知道&#xff1a;http://www.asp.net/Forums/ShowPost.aspx?tabindex1&PostID734458 不过&#xf…