Saltar al contenido

¿Cómo eliminar elementos de xml usando xslt con la hoja de estilo y xsltproc?

Solución:

Usando uno de los patrones de diseño XSLT más fundamentales: “Anulando el transformación de identidad“uno simplemente escribirá lo siguiente:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output omit-xml-declaration="yes"/>

    <xsl:template match="node()|@*">
      <xsl:copy>
         <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="Element[@fruit="apple" and @animal="cat"]"/>
</xsl:stylesheet>

Nota cómo la segunda plantilla anula la plantilla de identidad (1ª) sólo para los elementos denominados “Elemento” que tienen un atributo “fruta” con el valor “manzana” y el atributo “animal” con el valor “gato”. Esta plantilla tiene un cuerpo vacío, lo que significa que el elemento coincidente simplemente se ignora (no se produce nada cuando se empareja).

Cuando esta transformación se aplica en el siguiente documento XML de origen:

<doc>... 
    <Element name="same">foo</Element>...
    <Element fruit="apple" animal="cat" />
    <Element fruit="pear" animal="cat" />
    <Element name="same">baz</Element>...
    <Element name="same">foobar</Element>...
</doc>

se produce el resultado deseado:

<doc>... 
    <Element name="same">foo</Element>...
    <Element fruit="pear" animal="cat"/>
    <Element name="same">baz</Element>...
    <Element name="same">foobar</Element>...
</doc>

Se pueden encontrar más fragmentos de código sobre el uso y la anulación de la plantilla de identidad. aquí.

La respuesta de @Dimitre Novatchev es ciertamente correcta y elegante, pero hay una generalización (sobre la que el OP no preguntó): ¿qué pasa si el elemento que desea filtrar también tiene elementos secundarios o texto que desea? guardar?

Creo que esta pequeña variación cubre ese caso:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    version="2.0">

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <!-- drop DropMe elements, keeping child text and elements -->
    <xsl:template match="DropMe">
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>

La condición de coincidencia puede ser complicada para especificar otros atributos, etc., y puede usar varias de estas plantillas si está descartando otras cosas.

Entonces esta entrada:

<?xml version="1.0" encoding="UTF-8"?>
<mydocument>
    <p>Here's text to keep</p>
    <p><DropMe>Keep this text but not the element</DropMe>; and keep what follows.</p>
    <p><DropMe>Also keep this text and <b>this child element</b> too</DropMe>, along with what follows.</p>
</mydocument>

produce esta salida:

<?xml version="1.0" encoding="UTF-8"?><mydocument>
    <p>Here's text to keep</p>
    <p>Keep this text but not the element; and keep what follows.</p>
    <p>Also keep this text and <b>this child element</b> too, along with what follows.</p>
</mydocument>

Crédito al libro de cocina XSLT.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *