El exclude-result-prefixes
atributo de xsl:stylesheet
, cuando se especifican como "yes"
mandatos la eliminación de cualquier nodo de espacio de nombres de litreral resultado elemento (solo) que se heredan y no definen tanto el espacio de nombres-uri como el prefijo del elemento de resultado literal.
la siguiente declaración en la respuesta de Markus Jarderot está mal:
"excluir-result-prefijos sólo elimina los xmlns: foo =" "atributos en la etiqueta raíz del resultado".
Aquí es un contra-ejemplo:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:z="z:z" exclude-result-prefixes="z">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<z:x xmlns:z="z:z">
<z:y/>
</z:x>
</xsl:template>
</xsl:stylesheet>
Cuando se aplica esta transformación en cualquier documento XML (no se utiliza), el resultado es:
<z:x xmlns:z="z:z">
<z:y/>
</z:x>
Vemos que:
El nodo de espacio de nombres (y definición) para el espacio de nombres con valor (namespace-uri) "z: z" no se elimina del elemento superior (lo que Markus Jarderot llama "etiqueta raíz").
El espacio de nombre con el prefijo "z"
no se elimina de ningún elemento literal.
que muestra el simple hecho de que al especificar exclude-result-prefixes="yes"
no puede eliminar un espacio de nombres si no está en una LRE (Resultado literal Elemento) e incluso si un nodo espacio de nombres está en un LRE pero es definir el espacio de nombres a los cuales el elemento pertenece.
Para eliminar un elemento del espacio de nombres al que pertenece, o eliminar espacios de nombres de elementos que no son LRE, debemos especificar algún procesamiento adicional.
Un ejemplo es un reemplazo de la regla de la identidad tradicional con lo siguiente:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()[not(self::*)]">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
La transformación anterior sustituye a cualquier elemento o atributo con un elemento correspondiente o atributo que pertenece a "ningún espacio de nombres". Un uso potencial para esto es convertir un documento con un espacio de nombre predeterminado en un documento sin tal.
Por ejemplo, cuando se aplica sobre el documento XML siguiente fuente:
<z:x xmlns:z="z:z">
<z:y z:attr="someValue"/>
</z:x>
el resultado de la transformación es:
<x>
<y attr="someValue"/>
</x>
Por último una advertencia:
Esta transformación ion puede ser dañino si se aplica a documentos que contienen dos elementos (o dos atributos) que tienen el mismo nombre local pero pertenecen a dos espacios de nombres diferentes: la transformación los reemplaza por elementos (o atributos) que pertenecen al mismo espacio de nombres (no espacio de nombres).
Al utilizar XSL 2.0 y copiar elementos usando '' o '' , existe también el atributo de copia namespaces' 'muy útil. Establezca esto en 'no' para no copiar espacios de nombres al copiar el elemento. Más detalles en http://zvon.org/comp/r/ref-XSLT_2.html#Attributes~copy-namespaces. –
@ EiríkrÚtlendi, Sí, esto es útil. Desafortunadamente, esta no es una pregunta XSLT 2.0. Esta respuesta se puede usar (es portátil entre) XSLT 1.0 y XSLT 2.0/3.0 –
Sí, esto no es para XSL 1.0. Me encontré con este problema y encontré su solución, pero debido a restricciones técnicas, seguí buscando otra forma de hacerlo, y encontré el atributo 'copy-namespaces'. Para completar, agregué el comentario para cualquier buscador futuro. –