如何在XSLT里调用C#的代码

有两种方法: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

posted on   jack_Meng  阅读(1171)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

导航

< 2012年7月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 1 2 3 4
5 6 7 8 9 10 11
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏

主题色彩