Frage

Ich möchte reguläre Ausdrücke verwenden in Elemente mit der Match-Funktion auswählen. Ich würde es vorziehen, nicht um eine externe Bibliothek (wie Saxon) zu verwenden, um dies zu tun.

War es hilfreich?

Lösung

Es gibt einige Dinge in XSLT 2.0, die nicht in Bibliotheken im eingebauten unterstützt (gab es eine Diskussion über die Mono-Mailingliste darüber, aber ich kann die Informationen nicht mehr finden). Aber die meisten Menschen nie in die Ecke Fällen laufen die nicht unterstützt werden.

Eine andere Möglichkeit ist es, die Open-Source-auszuchecken http://saxon.sourceforge.net/ die große Unterstützung hat für 2.0.

EDIT (AB): Die oben akzeptierte Antwort verwirrend sein kann. Es gibt keine Unterstützung überhaupt und es gibt keine Pläne in dieser Richtung eine der XPath 2.0 oder XSLT 2.0-Funktionen in .NET.

Andere Tipps

Ich glaube, die Antwort in dieser Diskussion irreführend ist. Ich denke, .NET 3.5 nicht die meisten XSL / T 2.0-Funktionen (wenn überhaupt) unterstützen.

Ein Beispiel: :

Ein Aufruf zu einer 2,0-Funktion gibt die folgende Fehlermeldung unter .NET 3.5:

'current-datetime ()' ist eine unbekannte XSLT-Funktion.

Ich denke, die Antwort oben ist falsch. Ich kann keine Beweise dafür finden, dass Microsoft XSLT 2.0 unterstützt. XSLT! = XPath.

Für die Zukunft, hier ist eine schöne Seite über die Ausweitung der XPath / XQuery in .net:

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

Ich vertraue darauf, dies nicht zu halten, so dass ich kopieren Sie es hier:


XSLT ist eine Transformationssprache für XML. Es ermöglicht Serversysteme die Quelle XML-Baum in eine geeignete Form für die Kunden zu verwandeln. XSLT verwendet Knotenmuster gegen Vorlagen übereinstimmen seiner Transformationen durchzuführen. Obwohl es komplexe Transformationen relativ einfach macht es gibt einige Situationen, in denen wir einige benutzerdefinierten Klassen verwenden, müssen könnten.

Einige der Situationen, in denen wir brauchen könnten XSLT zu erweitern sind:

1) Ruf benutzerdefinierte Geschäftslogik
2) Führen Sie verschiedene Aktionen in Abhängigkeit von Berechtigungen
3) Führen Sie komplexe Formatierungen für Datum, Strings usw.
4) Oder sogar eine Webservice nennen !!

Schritte erweitern XSLT

1) Erstellen Sie das benutzerdefinierte Objekt aus zu verwenden, um innerhalb XSLT (in C #)

CustomDate custDate = new CustomDate() ;

2) Geben Sie eine benutzerdefinierte Namespace-Deklaration für die benutzerdefinierte Klasse innerhalb XSLTs Namespace-Deklaration (in XSLT-Datei)

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

3) Übergeben eine Instanz des benutzerdefinierten Objekts XSLT, mit dem gleichen Namensraum wie in letzter Stufe (in C #)

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

4) Verwenden Sie das Objekt aus XSLT (in XSLT-Datei)

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

Beispielcode

Für unser Beispiel nehmen wir an, wir eine XSLT Seite haben, wo wir Daten manipulieren müssen. Wir müssen die Anzahl der Tage, um zu zeigen, die Mitarbeiter im Unternehmen haben. Da XSLT keine nativen Datum Manipulation Funktionen hat, lassen Sie uns eine Erweiterung Objekt für unsere Aufgabe verwenden.

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() ;
    }

}

Kompilieren Sie diesen Code und verwenden Sie den mitgelieferten members.xml und memberdisplay.xsl diese Konsole Anwendung auszuführen. Sie sollten eine extendXSLT.html Datei im gleichen Ordner sehen. Öffnen Sie diese Datei und feststellen, dass unsere Klasse CustomDate die Anzahl der Tage zu berechnen aufgerufen wurde der Mitarbeiter im Unternehmen war.

Zusammenfassung:
XSLT ist eine leistungsfähige Transformationssprache für XML, jedoch unter Verwendung von Erweiterungsobjekten in .NET und C # sollte sicherstellen, dass wir leicht, was mit XSLT allein unmöglich oder schwer wäre erreichen könnten.

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>        

Wenn .NET-Unterstützung Diskussion für XSLT 2.0, XPath 2.0 und XQuery 1.0, ist es wichtig, zwischen den Sprachen selbst und das Datenmodell (XDM) zu unterscheiden. Das .NET 3.5 Framework unterstützt das Datenmodell, nicht aber die Sprachen. Wie es per E-Mail Korrespondenz vor kurzem erklärt von Microsoft Pawel Kadluczka zu mir:

  

Der Satz „Instanzen des XQuery   1.0 und XPath 2.0-Datenmodell“verwirrend sein kann, aber ich glaube, es bezieht sich auf   W3C XQuery 1.0 und XPath 2.0 Daten   Model (XDM) spec   ( http://www.w3.org/TR/xpath-datamodel )   dass lautet:

     

[Definition: Jede Instanz der   Datenmodell ist eine Folge.].

     

[Definition: Eine Sequenz ist eine geordnete   Sammlung von null oder mehr Elementen.] A   Sequenz kann nicht ein Mitglied einer sein,   Reihenfolge. Ein einzelnes Objekt erscheint auf   seine eigene wird als eine Folge modelliert   enthält ein Element. Sequenzen sind   definiert in 2,5 Sequenzen.

     

[Definition: Ein Element ist entweder ein Knoten   oder ein atomarer Wert]

     

Im Fall von XPath-API -   XPathNodeIterator ist die Sequenz   während XPathItem (XPathNavigator)   stellt das Element.

Ja, 3,5 XPathNavigator unterstützt XSLT 2.0.

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

„Die XPathNavigator-Klasse im Namespace System.Xml.XPath ist eine abstrakte Klasse, die für die Navigation und Bearbeitung von XML-Informationselementen als Instanzen des XQuery 1.0 und XPath 2.0-Datenmodelles eines Cursor-Modell definiert.“

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top