2009-05-19 28 views
7

Tengo un archivo XSL para transferir otro archivo XSL. ¡Quiero que la declaración del espacio de nombres esté en la etiqueta raíz, en lugar de que se repita en cada elemento individualmente!Espacio de nombres de etiqueta raíz XSLT en lugar del espacio de nombres de atributo de elemento

Aquí está mi hoja de estilo:

<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> 

da salida a algo como esto:

.... 

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

.... 

¿Cómo fuerzo la declaración de espacio de nombres en la etiqueta raíz del resultado ?!

Respuesta

8

Debe insertar el nodo de espacio de nombres en el elemento de documento de su árbol de resultados. Hay varias maneras de hacerlo, dependiendo de si está usando XSLT 1.0 o 2.0. La siguiente es una solución 2.0. Estoy asumiendo que usted está haciendo una identidad modificada transformar en el documento de entrada (su pregunta en realidad no especifica):

<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> 

Para una cobertura completa de todas las diferentes técnicas para el control de espacios de nombres en el documento de salida, echa un vistazo a la sección "Not enough namespaces" del artículo "Espacios de nombres en XSLT" en mi sitio web.

+1

Usted señor, es una leyenda. ¡Enlace insano! ¡Gracias! – JavaRocky

+0

¡Oh! Y tengo tu libro. x2 Estado de leyenda. – JavaRocky

+0

Gracias por sus palabras demasiado amables. :-) –

1

Tal vez me entienden mal la pregunta, pero creo que usted debe hacer esto:

<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> 

Eso le debería permitir utilizar las etiquetas de espacio de nombres como el espacio de nombres predeterminado y el documento de salida tendrán ellos como el espacio de nombres predeterminado como bien. Su documento de entrada todavía puede usar la espantosa sintaxis de mynamespace: tag.

Usted podría intentar hacer esto, también:

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

No estoy del todo seguro de que reemplazará MyNamespace: Etiqueta con sólo etiquetar sin embargo, y si lo hace, puede ser dependiente de la implementación.

+0

No, necesito ya que el espacio de nombres predeterminado es algo más. Este XSL es parte de una tubería XSLT. – JavaRocky

Cuestiones relacionadas