2012-06-25 10 views
11

Escribí "exclude-result-prefixes" e incluso entonces veo la apariencia de aparición del espacio de nombre en el resultado.Cómo evitar que ocurra todo el espacio de nombres en el resultado escribiendo una sola instrucción en XSLT

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:simple="Simple name space" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xmlns:tcm="http://www.tridion.com/ContentManager/5.0" 
    xmlns:xh="http://www.w3.org/1999/xhtml" 
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:transform-ext="urn:tridion:transform-ext" 
    xmlns="http://www.w3.org/1999/xhtml" 
    exclude-result-prefixes="#default simple xh"> 

Salida Real

<strong xmlns="Simple name space">abcd 
    <link xmlns="http://www.w3.org/1999/xhtml"> 
     <text>Header</text> 
    </link> 
</strong> 

¿Hay algún método para que pueda excluir todo el espacio de nombres escribiendo sola declaración.

Aquí he mencionado explícitamente

exclude-result-prefixes="#default simple xh" 

Cómo evitar toda apariencia de espacio de nombres en XSLT?

Respuesta

7

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:

  1. 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").

  2. 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).

+0

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

+0

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

+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. –

3

exclude-result-prefixes solo elimina los atributos xmlns:foo="" en la etiqueta raíz del resultado. Las etiquetas todavía están ligadas al mismo espacio de nombres. Como las etiquetas no tienen ningún prefijo coincidente, se utiliza el espacio de nombre predeterminado.

Si desea eliminar los espacios de nombres por completo, se puede usar la siguiente hoja de estilo:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="no"/> 

    <xsl:template match="/|comment()|processing-instruction()"> 
     <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> 

(fuente: TEI wiki)

2

El atributo exclude-result-prefixes eliminará (en algunas situaciones) las declaraciones de espacio de nombres no utilizadas de la salida. Nunca eliminará espacios de nombres que estén realmente en uso para elementos y atributos en el resultado: es decir, nunca cambiará los nombres de los elementos y atributos para ponerlos en un espacio de nombre diferente (o en ningún espacio de nombres). Si desea que los elementos no estén en un espacio de nombres, debe evitar ponerlos en un espacio de nombres cuando los genera, ya sea mediante el uso de elementos de resultado literales, xsl: element o xsl: copy.

0

intenta utilizar esto en su hoja de estilos:

<stylesheet 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml" ...etc > 

Tenía esta dentro de algunas etiquetas: xmlns="http://www.w3.org/1999/xhtml, por lo que añade las líneas 2 y está bien ahora.

Esta fuente me ayudaron: http://xmlplease.com/xhtmlxhtml

Cuestiones relacionadas