2008-11-26 5 views
61

Ich habe eine Menge von XML-Dateien, die etwas von der Form haben:Wie entferne ich Elemente aus XML mit xslt mit Stylesheet und xsltproc?

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

Was ich aus der Datei entfernt werden soll.

einen XSLT-Stylesheet verwenden und das Linux-Befehlszeilenprogramm xsltproc, wie ich dies tun könnte?

Durch diesen Punkt im Skript zu entfernen, um das Element Ich wünsche I enthalten bereits die Liste der Dateien haben, so kann die einzelne Datei als Parameter verwendet werden.


EDIT: die Frage wurde ursprünglich in Absicht fehlt.

Was ich versuche zu erreichen ist, das gesamte Element "Element" zu entfernen, wo (Frucht == "Apfel" & & Tier == "Katze"). Im selben Dokument gibt es viele Elemente mit dem Namen "Element", ich möchte, dass diese erhalten bleiben. So

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

würde:

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

Antwort

120

Mit einem der grundlegendsten XSLT Design-Muster: "Aufschalten der identity transformation" wird man nur schreiben folgendes:

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

HINWEIS Wie überschreibt die zweite Vorlage die Identitätsvorlage (1. Vorlage) nur für Elemente mit dem Namen "Element", die ein Attribut "Frucht" mit Wert haben e "Apfel" und Attribut "Tier" mit Wert "Katze". Diese Vorlage hat einen leeren Körper, was bedeutet, dass das übereinstimmende Element einfach ignoriert wird (es wird nichts erzeugt, wenn es angepasst wird).

Wenn diese Transformation auf die folgende XML-Quelldokument angewendet wird:

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

das gewünschte Ergebnis produziert wird:

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

Weitere Code-Schnipsel zu verwenden und das Überschreiben der Identity-Vorlage gefunden werden kann here.

+13

Trotz mir nicht einmal die richtige Frage, haben Sie beantwortet genau das, was ich fragen sollen! :) – Grundlefleck

+3

Warum markieren Sie diesen Beitrag nicht als die richtige Antwort? Dann würde es aus der Liste der unbeantworteten Probleme verschwinden. –

+2

Ich musste warten, bis ich festgestellt habe, dass es funktionierte und heute keine Chance mehr bei der Arbeit hatte. Fertig jetzt, danke Dimitre. – Grundlefleck

Verwandte Themen