2008-11-26 28 views
61

que tienen una gran cantidad de archivos XML que tienen algo de la forma:¿Cómo eliminar elementos de xml usando xslt con stylesheet y xsltproc?

<Element fruit="apple" animal="cat" /> 

¿Qué quiero ser retirado del archivo.

Usando una hoja de estilo XSLT y la utilidad de línea de comandos de Linux xsltproc, ¿cómo podría hacer esto?

En este punto del guión ya tengo la lista de archivos que contienen el elemento que deseo eliminar, por lo que el único archivo se puede usar como parámetro.


EDIT: la cuestión carecía originalmente en la intención.

Lo que estoy tratando de lograr es eliminar todo el elemento "Elemento" donde (fruta == "manzana" & & animal == "cat"). En el mismo documento hay muchos elementos llamados "Elemento", deseo que estos permanezcan. Así

<Element fruit="orange" animal="dog" /> 
<Element fruit="apple" animal="cat" /> 
<Element fruit="pear" animal="wild three eyed mongoose of kentucky" /> 

se convertiría en:

<Element fruit="orange" animal="dog" /> 
<Element fruit="pear" animal="wild three eyed mongoose of kentucky" /> 

Respuesta

120

Utilizando uno de los patrones más fundamentales de diseño XSLT: "Anulación del identity transformation" uno acaba de 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> 

Ten en cuenta cómo la segunda plantilla anula la plantilla de identidad (1ra) solo para elementos llamados "Elemento" que tienen un atributo "fruto" con valor e "manzana" y atributo "animal" con 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 combina).

Cuando se aplica esta transformación 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> 

el resultado deseado se produce:

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

Más fragmentos de código del uso y de la anulación de la plantilla de identidad se pueden encontrar here.

+13

A pesar de que ni siquiera estoy haciendo la pregunta correcta, ¡has respondido exactamente lo que debería haber preguntado! :) – Grundlefleck

+3

¿Por qué no marcas esta publicación como la respuesta correcta? Entonces desaparecería de la lista de problemas sin respuesta. –

+2

Tuve que esperar hasta que verifiqué que funcionó, y hoy no tuve la oportunidad de trabajar. Hecho ahora, gracias Dimitre. – Grundlefleck

Cuestiones relacionadas