有两种方法:1)内嵌脚本, 2)使用扩展对象
使用内嵌脚本的方法,MSDN上已经有比较清楚的描述: Script Blocks Using msxsl:script。但对扩展对象的描述好像并不清晰。其实扩展对象比内嵌更为强大。举个例子,假设我们想知道自己所关心城市的天气,我们用一个xml来描述:

<?xmlversion="1.0"encoding="utf-8" ?>
<china>
<city>Shanghai</city>
<city>Beijing</city>
</china>       

在这里我们想知道上海和北京两地的天气,并希望通过一个XSLT来转换出如下结果:
<Report>

<Cityname="Shanghai">多云</City>
<Cityname="Beijing">小雨</City>
</Report>

天气预报是通过调用一个web服务得到的。可以想象,单纯的XSLT绝对没办法把这事简单搞定。不过通过扩展对象,这件事情就变得异常简单了。
首先我们创建一个扩展对象:

public class WeatherReport
{
public string GetReport(string city)
{
return "weather of " + city;
}
}

这个对象支持一个方法:根据城市名称返回其天气。为简单起见,我们返回"weather of"加城市名字。在具体的应用中可以去调用具体的web服务。
下面这段代码实现将结果输出到屏幕上:

private static void ShowWeather(string xmlFile, string xsltFile)
{
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(xmlFile);
XmlDocument xsltDoc = new XmlDocument();
xsltDoc.Load(xsltFile);
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(xsltDoc.CreateNavigator());
XmlTextWriter writer = new XmlTextWriter(Console.Out);
writer.Formatting = Formatting.Indented;
XsltArgumentList xsltArgList = new XsltArgumentList();
xsltArgList.AddExtensionObject("urn:my.xslt.extension", new WeatherReport());
xslt.Transform(xmldoc, xsltArgList, writer);
writer.Close();
}

大部分代码和其他的都相同,不同的地方就是,需要将扩展对象作为参数传到你的XSLT里:
            xsltArgList.AddExtensionObject("urn:my.xslt.extension", new WeatherReport());

下面是XSLT文本:

<?xmlversion="1.0"encoding="UTF-8" ?>
<xsl:stylesheetversion="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:code="urn:my.xslt.extension"
>
<xsl:outputmethod="xml"indent ="yes"/>
<xsl:templatematch="china">
<xsl:elementname="Report">
<xsl:apply-templatesselect="city" />
</xsl:element>
</xsl:template>
<xsl:templatematch="china/city">
<xsl:elementname="City">
<xsl:attributename="name">
<xsl:value-ofselect="."/>
</xsl:attribute>
<xsl:value-ofselect="code:GetReport(.)"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

其他都一样,不同的是,我们需要定义扩展对象的命名空间
                xmlns:code ="urn:my.xslt.extension"
这个就是我们在代码AddExtensionObject传进去的命名空间
另外就是调用:
                        <xsl:value-ofselect ="code:GetReport(.)"/>
其实扩展对象的威力远远不止这些,你还可以接受一个XPathNodeIterator来处理节点树,甚至返回一个新的XPathNodeIterator让XLST做处理。

出处:http://blog.csdn.net/hiaspx/article/details/3620338

转载于:https://www.cnblogs.com/mq0036/archive/2012/07/18/2597672.html

如何在XSLT里调用C#的代码相关推荐

  1. vue项目如何在data里调用methods中的方法

    vue项目如何在data里调用methods中的方法 比如使用swiper组件在data里调用methods中函数的方式:data在vue项目里实际也是个函数,所以只要如下操作就行: data() { ...

  2. python如何用c语言表示_如何在python中调用C语言代码

    原博文 2019-04-03 14:19 − 1.使用C扩展CPython还为开发者实现了一个有趣的特性,使用Python可以轻松调用C代码 开发者有三种方法可以在自己的Python代码中来调用C编写 ...

  3. nodejs在cmd中运行js_如何在nodejs里调用执行系统命令

    每种语言都有自己的优势,互相结合起来各取所长程序执行起来效率更高或者说哪种实现方式较简单就用哪个,nodejs是利用子进程来调用系统命令或者文件,文档见nodejs.org/api/child_pro ...

  4. 如何在Github里创建organization和代码仓库

    在这个菜单里选择新建organization: 再邀请你的同事进这个organization: 然后就可以创建代码仓库了. 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

  5. 写作技巧:如何在word里优雅的插入代码

    在现实生活中,我们有时需要在word里插入代码,如果直接复制,缩进哪些会出问题.今天如何讲解下如何优雅的插入代码 第一步:打开网站 http://www.planetb.ca/syntax-highl ...

  6. 如何在html里调用javascript函数

    备用,加班过程中,不整理,使用环境,碰到了一个多图片显示的问题 1. a href="javascript:js_method();" 这是平台上常用的方法,但是这种方法在传递th ...

  7. Halcon初学者知识 【13】如何在MFC中调用Halcon代码

    要知道如何在MFC中调用Halcon代码,需要以下知识点: 在VC++2019的工程中,配置Halcon环境[请看此文] Halcon代码如何导出成C++代码 如何拆解halcon转换成C++的代码, ...

  8. 如何在idea里git提交代码时,能有emoji表情图片?emoji表情大全给大家奉上

    前言 大家好,我是奇想派,一名努力分享,誓要成为编程达人的程序员. 有一天撸代码,然后git commit的时候,发现注释都太单调了,想让代码提交页面充满点表情色彩.于是乎就开始搜索idea插件里是否 ...

  9. php中如何调用javascript,如何在php中调用javascript代码?

    JavaScript是客户端脚本语言,PHP是用于与数据库交互的服务器端脚本语言.那么如何在php中调用javascript代码?下面本篇文章给大家介绍一下.有一定的参考价值,有需要的朋友可以参考一下 ...

最新文章

  1. php wamp 环境好吗,phpstudy和wamp哪个好
  2. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(四)地图导航控件模块...
  3. native的Socket向Android的LocalSocketServer发送汉字乱码的问题
  4. 2015 Spark 将走向哪里?
  5. ionic3 cordova ionic-native插件
  6. (30)FPGA米勒型状态机设计(一段式)(第6天)
  7. 计算机专业开学要带电脑吗,大学新生刚开学需要带电脑吗
  8. java long 唯一_Java工具类:获取long型唯一ID
  9. MySQL在windows系统中修改datadir路径后无法启动问题,报错1067
  10. C语言自学指南(总觉 光阴不够)
  11. mysql 使用idb文件恢复数据
  12. 一个程序员上了7天班后
  13. 高仿微信拍照,视频录制-----JCameraView
  14. 河北省会计证年检流程
  15. 【MySQL入门指北】第六篇 按条件筛选
  16. OneDrive的申请与使用
  17. 利用 Lanczos 方法实现张量的 HOSVD 分解
  18. Beyond Compare4秘钥
  19. 【过一下 17】pytorch 改写 keras
  20. yocto系列讲解[理论篇]56 - poky下目录结构

热门文章

  1. Java abstract 关键字
  2. Redis 3.2.1集群 —— fail状态的产生
  3. 51Nod 1294 修改数组 —— LIS
  4. docker install
  5. 在Sql2005中,向表中插入数据时遇到uniqueidentifier列,如何插入数据?
  6. 一般函数指针和类(非MFC)的成员函数指针
  7. SSH实现分页查询(转)
  8. Linux下 数据文件 效验问题
  9. SQLSERVER2005安装说明
  10. SQL优化常用方法10