我想利用经常表达的选择元用于匹配的功能。我不喜欢使用一个外部图书馆(例如撒克逊人的)这样做。

有帮助吗?

解决方案

有一些事情在XSLT2.0不支持在建造在图书馆(没有讨论单的邮件列表关于这一点,但我找不到信息了).但大多数人从来没有遇到角落的情况下,不支持。

另一种选择是,检查了开放源 http://saxon.sourceforge.net/ 这具有极大的支持2.0.

编辑(AB):上述接受的答案可能造成混淆。有没有支持所有 没有计划在这个方向 对于任何XPath2.0or XSLT2.0功能。网。

其他提示

我相信答案在这里的讨论是一种误导。我认为。净3.5不支持最XSL/T2.0职能(如果有的话).

一个例子:

呼叫2.0功能提供以下错误信息。净3.5:

目前dateTime()'是一个未知的XSLT功能。

我认为答案上是错误的。我找不到任何证据表明,微软支持XSLT2.0.XSLT!= XPath。

对于未来的参考,这是一个很好的网页上延伸xpath/谢谢。网:

http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=64

我不相信这是最后一次,所以我复制:


XSLT是一种变换的语言对于XML。它允许服务器系统的改变来源XML树成为一个更合适的形式为客户。XSLT使用节点模式匹配的模板,以执行其变革。虽然这使得复杂的转变比较简单有一些情况下,我们可能必须使用的一些定制的课程。

一些情况下,我们可能需要延长XSLT是:

1)调定的业务逻辑
2)执行不同行动,根据权限
3)执行复杂的格式日期,等字符串
4)或甚至调用一个网络服务!!

步骤来延长XSLT

1)创建的定义对象使用从内XSLT(C#)

CustomDate custDate = new CustomDate() ;

2)提供一个定制的名字空间声明的定义类内Xslt namespace宣言》(在XSLT file)

<xsl:transform
        version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:myCustDate="urn:custDate">

3)通过一个实例所定义的对象XSLT,用相同的名字空间作为在最后一个步骤(C#)

xslArgs.AddExtensionObject("urn:custDate", custDate) ;

4)采用对象从内XSLT(在XSLT file)

<xsl:value-of select="myCustDate:GetDateDiff(./joiningdate)"/>

代码样本

对于我们这个例子让我们假设,我们有一个XSLT片在哪里,我们需要操作的日期。我们需要显示该数天,雇员已经与该公司。由于XSLT没有当地的日期操纵功能,让我们利用一个扩展对于我们的任务。

using System ;
using System.IO ;
using System.Xml ;
using System.Xml.Xsl ;
using System.Xml.XPath ;

public class XsltExtension{

    public static void Main(string[] args){

        if (args.Length == 2){

            Transform(args[0], args[1]) ;

        }else{

            PrintUsage() ;

        }
    }

    public static void Transform(string sXmlPath, string sXslPath){

        try{

            //load the Xml doc
            XPathDocument myXPathDoc = new XPathDocument(sXmlPath) ;

            XslTransform myXslTrans = new XslTransform() ;

            //load the Xsl 
            myXslTrans.Load(sXslPath) ;

            XsltArgumentList xslArgs = new XsltArgumentList() ;

            //create custom object
            CustomDate custDate = new CustomDate() ;

            //pass an instance of the custom object
            xslArgs.AddExtensionObject("urn:custDate", custDate) ;

            //create the output stream
            XmlTextWriter myWriter = new XmlTextWriter("extendXSLT.html", null) ;

            //pass the args,do the actual transform of Xml
            myXslTrans.Transform(myXPathDoc,xslArgs, myWriter) ;        

            myWriter.Close() ;

        }catch(Exception e){

            Console.WriteLine("Exception: {0}", e.ToString());
        }

    }

    public static void PrintUsage(){
        Console.WriteLine("Usage: XsltExtension.exe <xml path> >xsl path<") ;
    }

}

//our custom class
public class CustomDate{

    //function that gets called from XSLT
    public string GetDateDiff(string xslDate){

        DateTime dtDOB = DateTime.Parse(xslDate) ;

        DateTime dtNow = DateTime.Today ;

        TimeSpan tsAge = dtNow.Subtract(dtDOB) ;

        return tsAge.Days.ToString() ;
    }

}

编制这种代码和使用提供的members.xml 和memberdisplay.xsl运行这种控制台应用程序。你应该看到一个extendXSLT.html 文件在同一个文件夹。打开这个文件,并注意到,我们的类CustomDate已被称为数来计算的天,雇员已经在该公司。

摘要:
XSLT是一个强大的转变XML语言,但是使用扩展的对象。净和C#应该确保,我们可以很容易地完成什么是不可能或很难与XSLT单。

Members.xml:

 <root>
    <member>
        <name>Employee1</name>
        <joiningdate>01/01/1970</joiningdate>
        <role>CTO</role>
    </member>
    <member>
        <name>Employee2</name>
        <joiningdate>24/07/1978</joiningdate>
        <role>Web Developer</role>
    </member>
    <member>
        <name>Employee3</name>
        <joiningdate>15/12/1980</joiningdate>
        <role>Tester</role>
    </member>
</root>

Memberdisplay.xsl:

<xsl:transform
        version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:myCustDate="urn:custDate">

<xsl:output method="html" omit-xml-declaration="yes" />     

    <xsl:template match="/">
        <html>
            <head>
                <style>
                    TABLE.tblMaster
                    {
                        border-style: solid; 
                        border-width: 1px 1px 1px 1px; 
                        border-style: solid; 
                        border-color:  #99CCCC; 
                        padding: 4px 6px; 
                        text-align: left; 
                        font-family:Tahoma,Arial;
                        font-size:9pt;

                    }
                    TD.tdHeader
                    {
                        FONT-WEIGHT: bolder;
                        FONT-FAMILY: Arial;
                        BACKGROUND-COLOR: lightgrey;
                        TEXT-ALIGN: center
                    }
                </style>
            </head>
            <body>
                <table width="50%" class="tblMaster">
                    <tr >
                        <td class="tdHeader">Employee</td>
                        <td class="tdHeader">Join date</td>
                        <td class="tdHeader">Days in company</td>
                        <td class="tdHeader">Role</td>
                    </tr>
                    <xsl:for-each select="/root/member">

                        <tr >
                            <td> <xsl:value-of select="./name"/> </td>

                            <td> <xsl:value-of select="./joiningdate"/> </td>

                            <td> <xsl:value-of select="myCustDate:GetDateDiff(./joiningdate)"/> </td>

                            <td> <xsl:value-of select="./role"/> </td>
                        </tr>   

                    </xsl:for-each>

                </table>
            </body>
        </html>
    </xsl:template>

</xsl:transform>        

当讨论。净支持XSLT2.0,XPath2.0,谢谢1.0,重要的是要区分自己的语言和数据模型(它).。净3.5框架支持的数据模型,而不是语言。因为它是最近向我解释通过电子邮件往来由微软帕维尔Kadluczka:

句子中的"实例的,谢谢 1.0和XPath2.0数据模型"可能令人困惑但是我认为,它指的是 W3C属1.0和XPath2.0数据 模型(它)规范 (http://www.w3.org/TR/xpath-datamodel) 这一读取:

[定义:每一个实例 数据模型是一个序列。].

[定义:一序列是一个有序 收集的零或更多的项目。] 一个 顺序不能中的一员 序列。一个单一的项目上出现 自己是模仿作为一个序列 包含一个项目。序列 定义在2.5序列。

[定义:一个项目是一个节点 或原子值],

在这种情况下的XPath API- XPathNodeIterator是的序列 同时,是否(XPathNavigator) 表示该项目。

是的,3.5XPathNavigator支持XSLT2.0.

http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathnavigator.aspx

"XPathNavigator类的系统。Xml。XPath名称空间是一个抽象的类定义标模型,用于导航和编辑XML信息项目为实例,谢谢1.0和XPath2.0数据模型"。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top