2011-10-13 30 views
7

me gustaría quitar las etiquetas que contienen sólo espacio en blanco/salto de línea/tab caracteres, como a continuación:XPath/XSLT eliminar etiquetas vacías

<p> </p> 

¿Cómo hacer esto usando funciones XPath y XSLT plantillas?

+0

Buena pregunta, +1. Es posible producir correctamente el resultado deseado utilizando el patrón de diseño XSLT más fundamental y potente: anulando la regla de identidad. –

Respuesta

10

Esta transformación (anulando la identity rule):

<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()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[not(*) and not(text()[normalize-space()])]"/> 
</xsl:stylesheet> 

cuando se aplica al siguiente documento XML:

<t> 
<a> 
    <b> 
    <c/> 
    </b> 
</a> 
<p></p> 
<p> </p> 
<p>Text</p> 
</t> 

produce correctamente el resultado deseado:

<t> 
    <a> 
     <b/> 
    </a> 
    <p>Text</p> 
</t> 

Recuerde: El uso y la anulación de la regla/plantilla de identidad es el patrón de diseño XSLT más fundamental y potente. Es la elección ideal para una variedad de problemas en los que la mayoría de los nodos se van a copiar sin cambios y sólo algunos nodos específicos necesitan ser alterado, borrado, renombrado, ..., etc.

Nota: @Abel en su comentario recomienda que algunas partes de esta solución tienen que estar más lejos explicó:

para los no iniciados o curiosos: not(*) medios: no tener un hijo elemento; not(text()[normalize-space()]) significa: no tener un nodo de texto con texto que no sea de espacio en blanco.

+4

Para los no iniciados o curiosos: 'not (*)' significa: no tener un elemento hijo; 'not (text() [normalize-space()])' significa: no tener un nodo de texto con texto. – Abel

+0

@Abel: Gracias, explicaré esto en la respuesta. –

+1

Eso es genial, gracias Dimitre. Todavía soy un principiante con XSLT y sigo encontrando cosas como esta que hacen que te vuelvas loco. Creo que necesito encontrar un buen libro. Gracias de nuevo por la asombrosa explicación, SO necesita más de esto. – Kyle

Cuestiones relacionadas