Pergunta

Eu gostaria de usar expressões regulares na seleção de elementos usando a função jogo. Eu prefiro não usar uma biblioteca externa (como saxão) para fazer isso.

Foi útil?

Solução

Há algumas coisas em XSLT 2.0 que não são suportadas na construído em bibliotecas (houve discussão sobre a lista mono discussão sobre isso, mas não consigo encontrar as informações mais). Mas a maioria das pessoas nunca correr para os casos de canto que não são suportadas.

Outra opção é verificar a fonte aberta http://saxon.sourceforge.net/ que tem grande apoio para 2.0.

EDIT (AB): acima resposta aceita pode ser confuso. Não há suporte em tudo e há há planos nesse direção para qualquer uma das funções XPath 2.0 ou XSLT 2.0 no .NET.

Outras dicas

Creio que a resposta nesta discussão é enganosa. Eu acho que o .NET 3.5 não suporta funções mais XSL / T 2.0 (se houver algum).

Um exemplo :

A chamada para uma função 2.0 dá a seguinte mensagem de erro sob .NET 3.5:

'current-dateTime ()' é uma função XSLT desconhecido.

Eu acho que a resposta acima está errado. Não consigo encontrar qualquer evidência de que a Microsoft suporta XSLT 2.0. XSLT! = XPath.

Para referência futura, aqui está uma página agradável na extensão XPath / XQuery em .net:

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

Eu não confio isto a última, então eu copiá-lo aqui:


XSLT é uma linguagem de transformação para XML. Ele permite que sistemas de servidor para transformar a árvore XML de origem em uma forma mais adequada para os clientes. XSLT usa padrões de nó para o jogo contra modelos de desempenhar as suas transformações. Embora ele faz transformações complexas relativamente simples, existem algumas situações em que pode ter que usar algumas classes personalizadas.

Algumas das situações em que possam ter necessidade de estender XSLT são:

1) custom chamada lógica de negócios
2) Realizar ações diferentes, dependendo Permissão
3) Execute a formatação complexa para datas, cordas etc
4) Ou até mesmo chamar um webservice !!

Passos para estender XSLT

1) Criar o objeto personalizado para uso de dentro XSLT (em C #)

CustomDate custDate = new CustomDate() ;

2) Fornecer uma declaração de namespace personalizado para a classe personalizada dentro XSLTs declaração de namespace (em arquivo XSLT)

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

3) Passar uma instância do objeto personalizado para XSLT, com o mesmo namespace como na última etapa (em C #)

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

4) Use o objeto de dentro XSLT (em arquivo XSLT)

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

Exemplo de código

Para o nosso exemplo, vamos supor que temos uma folha XSLT onde precisamos manipular datas. Precisamos mostrar o número de dias que o empregado tenha sido com a empresa. Desde XSLT não tem funções de manipulação de data nativos, vamos usar um objeto de extensão para a nossa tarefa.

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

}

Compilar este código e usar o members.xml fornecido e memberdisplay.xsl para executar este aplicativo console. Você deverá ver um arquivo extendXSLT.html dentro da mesma pasta. Abra este arquivo e observe que a nossa classe CustomDate foi chamada para calcular o número de dias que o empregado tem sido na empresa.

Resumo:
XSLT é uma linguagem de transformação poderosa para XML, porém utilizando objetos de extensão em .NET e C # deve garantir que poderíamos facilmente realizar o que seria impossível ou difícil com XSLT sozinho.

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 se discute suporte .NET para XSLT 2.0, XPath 2.0 e XQuery 1.0, é importante distinguir entre os próprios eo modelo de dados (XDM) idiomas. O .NET Framework 3.5 suporta o modelo de dados, mas não as línguas. Como foi recentemente explicou-me via e-mail correspondência por Pawel Kadluczka da Microsoft:

A frase "instâncias do XQuery 1.0 e XPath 2.0 Data Model" pode ser confuso, mas eu acredito que se refere a W3C Xquery 1,0 e 2,0 XPath dados Modelo (XDM) especificação ( http://www.w3.org/TR/xpath-datamodel ) que diz:

[Definição: Cada instância do modelo de dados é uma sequência.].

[Definição: seqüência A é um ordenado coleção de zero ou mais itens.] A sequência não pode ser um membro de um seqüência. Um único item que aparece em sua própria é modelada como uma sequência contendo um item. sequências são definido em 2,5 Sequências.

[Definição: Um item é um nó ou um valor atômico],

No caso de XPath API - XPathNodeIterator é a sequência enquanto XPathItem (XPathNavigator) representa o item.

Sim, 3.5 suporta XPathNavigator XSLT 2.0.

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

"A classe XPathNavigator no espaço de nomes System.Xml.XPath é uma classe abstrata que define um modelo de cursor para navegar e editar itens de informação XML como instâncias do modelo de dados XQuery 1.0 e XPath 2.0."

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top