2009-05-13 10 views
33

Me gustaría tomar datos de algunos archivos XML y transformarlos en un nuevo documento XML. Sin embargo, no quiero que la definición de un espacio de nombres en el XSLT ocurra en el documento de resultados.XSL: Evite exportar definiciones de espacio de nombres a los documentos XML resultantes

En otras palabras:

fuente:

<Namespace:Root xmlns:Namespace="http://www.something.com"> 

hoja de estilo:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:Namespace="http://www.something.com"> 

resultado:

<resultRoot xmlns:Namespace="http://www.something.com"> 
<!--I don't want the Namespace definition above--> 

estoy usando msxsl para la transformación.

Respuesta

60

Usted puede utilizar el atributo exclude-result-prefixes del elemento xsl:stylesheet para suprimir los espacios de nombre del documento de salida:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:Namespace="http://www.something.com" 
     exclude-result-prefixes="Namespace"> 

</xsl:stylesheet> 

Para suprimir varios espacios de nombres del documento de salida, especifíquelos separados por espacios en blanco:

exclude-result-prefixes="ns1 ns2 ns3" 

Desde el XSLT specification:

Cuando una hoja de estilo utiliza una declaración de espacio sólo para los fines de abordar el árbol de origen, especificando el prefijo en el excluyen-result-prefijos atribuyen evitará declaraciones de espacios superfluos en el árbol de resultados.

-4

utilizar la extensión de elemento prefijos = "espacio de nombres"

como:

<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:datetime="http://exslt.org/dates-and-times" 
xmlns:str="http://exslt.org/strings" 
xmlns:exsl="http://exslt.org/common" 
xmlns:uw="xalan://ru.sbtc.util.XSLUtil" 
extension-element-prefixes="exsl str datetime uw" 
version="1.0"> 
+0

Supongo que se refería a exclude-result-prefixes? –

+0

Estamos usando extension-element-prefixes y funciona muy bien. – alamar

+2

extension-element-prefixes tiene el mismo efecto, pero tiene un efecto adicional. Cualquier elemento que coloque en uno de esos espacios de nombres se interpretará como un elemento de extensión (en lugar de un elemento de resultado literal). Eso puede ser apropiado para los ejemplos que tienes en tu respuesta. Pero si no quiere ese comportamiento adicional, simplemente use exclude-result-prefixes –

9

La respuesta de Divo ya se ha elegido, y de forma adecuada.

Pero si estás interesado en profundizar, echa un vistazo a la sección "Too many namespaces" en mi magnum opus sobre el tema popularmente popular de "Namespaces in XSLT". (Sí, eso está destinado a ser irónico. :-))

+0

¡Hola @Evan! Un enlace muy útil, de hecho! El truco para no tener los espacios de nombres no deseados durante el uso de la copia es justo lo que quería. Lo que me sorprendió, sin embargo, es que este truco realmente no funciona para XSLT 2.0 (por ejemplo, con XALAN), pero debes seguir la ruta que trazaste para 2.0. En XSLT 1.0 (por ejemplo, usando 'xsltproc') funcionó bien. Por lo tanto, el cambio de un XSLT 1.0 a un procesador XSLT 2.0 puede cambiar significativamente la salida, aunque semánticamente los espacios de nombres adicionales no deberían ser un problema en sentido descendente, excepto tal vez por aspectos de volumen. –

Cuestiones relacionadas