2010-05-10 19 views
13

Spero che tu possa aiutare ... Supponiamo che ho seguente codice XML:aggiungere namespace + prefisso XML utilizzando XSL

<data> 
    <token> 
     <sessionId>12345</sessionId>   
     <userId>john</userId> 
     <moreInfo> 
     <bla> ..... 
     </bla> 
     </moreInfo> 
    </token> 
</data> 

E ho bisogno di questo per diventare

<login:data xmlns:login="http://my.ns.uri"> 
     <login:token> 
      <login:sessionId>12345</sessionId>   
      <login:userId>john</userId> 
      <login:moreInfo> 
      <login:bla> ..... 
      </login:bla> 
      </login:moreInfo> 
     </login:token> 
    </login:data> 

Posso fare questo con XSL? Ho provato ma ho fallito miseramente ... Qualsiasi aiuto sarebbe molto apprezzato!

Grazie, Gen

+2

In realtà, quello che ha prodotto è male XML. Vuoi 'xmlns: login =" http: //my.ns.uri "'. –

+0

hai ragione, questo è quello che voglio. xmlns: login = "http: //my.ns.uri" ma quale potrebbe essere l'XSL per fare qualcosa del genere? – Jan

+0

Buona domanda (+1). Vedi la mia risposta per una soluzione completa e corretta. :) –

risposta

12

Uso:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:login="http://my.ns.uri"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*"> 
    <xsl:element name="login:{name()}" namespace="http://my.ns.uri"> 
    <xsl:copy-of select="namespace::*"/> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

Quando questa trasformazione viene applicata sul documento XML fornito, The Wanted, risultato corretto è prodotto:

<login:data xmlns:login="http://my.ns.uri"> 
    <login:token> 
     <login:sessionId>12345</login:sessionId> 
     <login:userId>john</login:userId> 
     <login:moreInfo> 
     <login:bla> ..... 
     </login:bla> 
     </login:moreInfo> 
    </login:token> 
</login:data> 
+0

Grazie mille, questo è esattamente ciò che intendevo e avevo bisogno, mi hai salvato da un brutto mal di testa :) – Jan

0
<xsl:template match="*"> 
    <xsl:element name="{local-name()}" namespace="http://my.ns.uri"> 
    <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 
+0

Va bene, lo capisco. Ma come posso cambiare i prefissi di tutti gli elementi? – Jan

+0

I prefissi sono qualcosa, che è piuttosto fluido in XML. Voglio dire, che le specifiche dicono esplicitamente che sono * arbitrarie *. Quindi, il tuo processore XSLT sarebbe libero di cambiarli in qualunque cosa piaccia. Tuttavia, ogni motore XSLT (noto a me) riutilizza i prefissi che hai scritto nel tuo tag di apertura '', se non ci sono ragioni per non farlo (come il prefisso exclude-result-XSLT di XSLT)). – Boldewyn

+0

Ok, fammi giocare con questo .... Grazie! – Jan

0

XSLT 2.0 è più efficiente e compatto. Supporta l'aggiunta diretta di spazi dei nomi al nodo. Non è necessario definire nulla nell'avvio del foglio di stile.

Ecco le specifiche: creating namespace prefix

Usa:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:template match="*"> 
    <xsl:element name="login:{name()}" xmlns:login="http://my.ns.uri"> 
    <xsl:namespace name="login">http://my.ns.uri</xsl:namespace> 
    <xsl:value-of select="node()"/> 
    <xsl:apply-templates select="*"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

Darà l'output:

<login:data xmlns:login="http://my.ns.uri"> 
    <login:token> 
     <login:sessionId>12345</login:sessionId> 
     <login:userId>john</login:userId> 
     <login:moreInfo> 
     <login:bla> ..... 
     </login:bla> 
     </login:moreInfo> 
    </login:token> 
</login:data> 
Problemi correlati