2010-08-12 7 views
10

Tengo un archivo de entrada que usa el espacio de nombres de mi compañía en el espacio de nombres predeterminado (xmlns="companyURL") pero quiero que el archivo de salida use algo distinto al espacio de nombres predeterminado (xmlns:cmp="companyURL"). Así que construyo mi archivo utilizando el espacio de nombres cmp, pero luego quiero copiar algunos de los elementos internos:Cambiar el espacio de nombres para el archivo XML en XSL Translation

<xsl:element name="cmp:container"> 
    <xsl:for-each select="foo"> 
    <xsl:copy-of select="." /> 
    </xsl:for-each> 
</xsl:element> 

Por desgracia, lo que esto hace es definir el espacio de nombres predeterminado para cada uno de esos elementos internos, por lo que el archivo increíblemente verboso y feo. Ejemplo simplificado:

Fuente:

<foo xmlns="companyURL"> 
    <num1>asdf</num1> 
    <num2>ghjkl</num2> 
</foo> 

Se convierte en:

<cmp:container xmlns:cmp="companyURL"> 
    <num1 xmlns="companyURL">asdf</num1> 
    <num2 xmlns="companyURL">ghjkl</num2> 
</cmp:container> 

Por supuesto, companyURL es grande y larga y desagradable, y es el mismo en ambos lugares, por lo que lo haría prefiere que el resultado anterior sea el siguiente:

<cmp:container xmlns:cmp="companyURL"> 
    <cmp:num1>asdf</cmp:num1> 
    <cmp:num2>ghjkl</cmp:num2> 
</cmp:container> 

¿Hay una manera fácil de hacer esto o debo convertir todo en el espacio de nombre cmp en el espacio de nombres predeterminado? Preferiría usar el nombre de espacio de nombres explícito si es posible, ayuda a comprender el XSLT en mi experiencia.

+0

Buena pregunta (+1). Vea mi respuesta para una solución corta y simple, :) –

+0

* "quiero que mi archivo de salida use algo que no sea el espacio de nombres predeterminado" * >> siguiendo su ejemplo, cambiar el prefijo (o de forma predeterminada a un prefijo) no significa cambiar el espacio de nombres Los elementos, desde un punto de vista XML + NS, se mantendrán iguales (nombre local + espacio de nombre no se altera), aunque el prefijo sea diferente. – Abel

+0

Me refería al identificador visible delante del nombre de la etiqueta. –

Respuesta

10

Esta transformación:

<xsl:template match="*"> 
    <xsl:element name="cmp:{name()}" namespace="CompanyURL"> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
<xsl:template match="/*"> 
    <cmp:container xmlns:cmp="CompanyURL"> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </cmp:container> 
</xsl:template> 
</xsl:stylesheet> 

cuando se realiza en el documento XML proporcionado:

<foo xmlns="companyURL"> 
    <num1>asdf</num1> 
    <num2>ghjkl</num2> 
</foo> 

produce el resultado deseado, correcta:

<cmp:container xmlns:cmp="CompanyURL"> 
    <cmp:num1>asdf</cmp:num1> 
    <cmp:num2>ghjkl</cmp:num2> 
</cmp:container> 
+1

¿Por qué tiene '' en su XSLT? –

+2

@ adam_0: Esto copia todos los atributos del elemento. En su ejemplo concreto no hay atributos, pero si queremos usar este código como un convertidor general, debe poder convertir correctamente todos los documentos, incluidos aquellos en los que hay elementos con atributos. –

+0

Mi esquema XML especifica que no habrá atributos, así que supongo que está bien dejar esa línea. –

Cuestiones relacionadas