Domanda

Vorrei usare le espressioni regolari nella selezione degli elementi utilizzando la funzione di corrispondenza.Preferisco non usare una libreria esterna (come anglosassoni) per fare questo.

È stato utile?

Soluzione

Ci sono alcune cose in XSLT 2.0, che non sono supportati nella costruito in librerie (c'era la discussione sul mono mailing list su questo, ma non riesco a trovare le informazioni più).Ma la maggior parte delle persone mai eseguito in un angolo casi che non sono supportati.

Un'altra opzione è quella di controllare l'open source http://saxon.sourceforge.net/ che ha un grande supporto per la 2.0.

EDIT (AB):sopra accettato risposta può essere fonte di confusione.Non c'è alcun supporto a tutti e ci sono piani in quella direzione per qualsiasi XPath 2.0 o XSLT 2.0 funzioni .NET.

Altri suggerimenti

Io credo che la risposta a questa discussione è fuorviante.Penso che .NET 3.5 non supporta più di XSL/T 2.0 funzioni (se a tutti).

Un esempio:

Una chiamata a un 2.0 funzione dà il seguente messaggio di errore sotto .NET 3.5:

corrente dateTime()' è uno sconosciuto funzione XSLT.

Penso che la risposta di cui sopra è sbagliato.Non riesco a trovare alcuna prova che Microsoft supporta XSLT 2.0.XSLT != XPath.

Per riferimento futuro, ecco una bella pagina sull'estensione xpath/xquery in .net:

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

Non mi fido di questo ultimo, così la copio qui:


XSLT è una trasformazione del linguaggio XML.Esso consente di sistemi server di trasformare il sorgente XML albero in una forma adatta per i clienti.XSLT utilizza nodo modelli per abbinare contro modelli per realizzare le sue trasformazioni.Se rende complesse trasformazioni relativamente semplice, ci sono alcune situazioni in cui si potrebbe utilizzare alcune classi personalizzate.

Alcune delle situazioni in cui potrebbe essere necessario estendere XSLT sono:

1) Chiamare la logica di business personalizzata
2) Eseguire diverse azioni a seconda delle Autorizzazioni
3) Eseguire complesse operazioni di formattazione di date, stringhe, ecc
4) O anche chiamare un webservice!!

Procedura per estendere XSLT

1) Creare un oggetto personalizzato da utilizzare dall'interno XSLT(in C#)

CustomDate custDate = new CustomDate() ;

2) Fornire un custom dichiarazione dello spazio dei nomi per la classe personalizzata all'interno di Trasformazioni dichiarazione dello spazio dei nomi(in file XSLT)

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

3) Passare un'istanza dell'oggetto personalizzato per XSLT, con lo stesso spazio dei nomi, in ultimo passo(in C#)

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

4) Utilizzare l'oggetto da XSLT(in file XSLT)

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

Codice di esempio

Per il nostro esempio, supponiamo che abbiamo un foglio XSLT in cui abbiamo bisogno di modificare le date.Abbiamo bisogno di mostrare il numero di giorni in cui il dipendente è stato con l'azienda.Dal XSLT non ha nativo data di funzioni di manipolazione, cerchiamo di utilizzare un oggetto di estensione per il nostro compito.

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

}

Compilare il codice e utilizzare il members.xml e memberdisplay.xsl per eseguire questa applicazione console.Si dovrebbe vedere una extendXSLT.html file nella stessa cartella.Aprire il file e a notare che la nostra classe CustomDate è stato chiamato a calcolare il numero di giorni in cui il dipendente è stato in azienda.

Sommario :
XSLT è un potente trasformazione del linguaggio XML, tuttavia l'uso di oggetti di estensione in .NET e C# dovrebbe garantire che si potrebbe facilmente realizzare ciò che sarebbe impossibile o difficile con XSLT da solo.

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>        

Quando si parla .NETTO il supporto per XSLT 2.0, XPath 2.0 e XQuery 1.0, è importante distinguere tra le lingue e il Modello dei Dati (XDM).L' .NET Framework 3.5 supporta il Modello di Dati, ma non le lingue.Come è stato recentemente spiegato a me via e-mail da Microsoft Pawel Kadluczka:

La frase "le istanze di XQuery 1.0 e XPath 2.0 Modello di Dati" può essere fonte di confusione, ma credo che si riferisce a W3C e XPath XQuery 1.0 2.0 Dati Modello (XDM) spec. (http://www.w3.org/TR/xpath-datamodel) che si legge:

[Definizione:Ogni istanza di modello di dati è una sequenza.].

[Definizione:Una sequenza è ordinata raccolta di zero o più elementi.] Un la sequenza non può essere un membro di una sequenza.Un unico elemento che appare sul è modellata come una sequenza contenente un solo elemento.Le sequenze sono definito in 2,5 Sequenze.

[Definizione:Un elemento è un nodo o un valore atomico],

In caso di XPath API - XPathNodeIterator è la sequenza mentre XPathItem (XPathNavigator) rappresenta l'elemento.

Sì, 3.5 XPathNavigator supporta XSLT 2.0.

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

"La classe XPathNavigator nel Sistema.Xml.XPath spazio dei nomi è una classe astratta che definisce un modello di cursore per la navigazione e la modifica di informazioni XML come istanze di XQuery 1.0 e XPath 2.0 Modello di Dati."

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top