2009-05-19 3 views
7

Ho un file XSL per trasferire un altro file XSL. Voglio che la dichiarazione dello spazio dei nomi sia sul tag radice, invece di essere ripetuta su ogni singolo elemento !!Spazio nomi tag radice XSLT anziché spazio attributo elemento nome

Ecco il mio foglio di stile:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mynamespace="somenamespace" version="2.0"> 
    <xsl:output method="xml" omit-xml-declaration="no" standalone="yes" indent="yes" /> 
    <xsl:template match="myMatchedNode"> 
     <mynamespace:tag>Some text i want inserted into the xsl</mynamespace:tag> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /></xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

emette qualcosa di simile:

.... 

<mynamespace:tag xmlns:mynamespace="somenamespace">Some text i want inserted into the xsl</mynamespace:tag> 

.... 

Come forzo la dichiarazione dello spazio dei nomi sul tag radice del risultato ?!

risposta

8

È necessario inserire il nodo dello spazio dei nomi sull'elemento del documento dell'albero dei risultati. Ci sono diversi modi per farlo, a seconda che tu stia usando XSLT 1.0 o 2.0. Quanto segue è una soluzione 2.0. Sto assumendo che si sta facendo un'identità modificato trasformare il documento di input (la tua domanda in realtà non specificato):

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!-- special rule for the document element --> 
    <xsl:template match="/*"> 
    <xsl:copy> 
     <!-- Add a namespace node --> 
     <xsl:namespace name="mynamespace" select="'somenamespace'"/> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

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

    <!-- the rest of your rules --> 

</xsl:stylesheet> 

Per una copertura completa di tutte le diverse tecniche di controllo namespace nel documento di output, controlla la sezione "Not enough namespaces" dell'articolo "Namespace in XSLT" sul mio sito web.

+1

Signore, sei una leggenda. Link folle! Grazie! – JavaRocky

+0

Oh! E ho il tuo libro. x2 Stato della legenda. – JavaRocky

+0

Grazie per le tue parole troppo gentili. :-) –

1

Forse mi fraintendere la domanda, ma penso che si dovrebbe fare questo:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="somenamespace" 
    version="2.0"> 

<xsl:output method="xml" omit-xml-declaration="no" standalone="yes" indent="yes"/> 

<xsl:template match="myMatchedNode"> 
    <tag>Some text i want inserted into the xsl</mynamespace> 

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

</xsl:stylesheet> 

Questo dovrebbe consentire di utilizzare i tag namespace come spazio dei nomi predefinito e il documento di output li avrà come lo spazio dei nomi di default come bene. Il tuo documento di input può ancora utilizzare il brutto mynamespace: tag sintassi.

Si potrebbe provare a fare anche questo:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="somenamespace" 
    xmlns:mynamespace="somenamespace" 
    version="2.0"> 

io non sono del tutto sicuro che andrà a sostituire MyNamespace: tag con un solo tag, però, e se lo fa, può essere a carico di attuazione.

+0

No, ho bisogno di come lo spazio dei nomi predefinito è un'altra cosa. Questo XSL fa parte di una pipeline XSLT. – JavaRocky