2008-11-26 7 views
61

mam dużo plików XML, które mają coś w postaci:Jak usunąć elementy z xml za pomocą xslt z stylesheet i xsltproc?

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

Który Chcę zostać usunięte z pliku.

Korzystając z arkusza stylów XSLT i narzędzia wiersza polecenia xsltproc dla systemu Linux, w jaki sposób mogę to zrobić?

W tym miejscu skryptu mam już listę plików zawierających element, który chcę usunąć, więc pojedynczy plik może być użyty jako parametr.


EDIT: kwestia została pierwotnie pozbawione intencji.

Co staram się osiągnąć, to usunąć cały element "Element" gdzie (owoc == "jabłko" & & zwierzę == "kot"). W tym samym dokumencie jest wiele elementów o nazwie "Element", chciałbym, aby one pozostały. Więc

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

staną:

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

Odpowiedz

120

Korzystanie z jednym z najbardziej fundamentalnych wzorców projektowych XSLT: "przesłanianie identity transformation" będzie jeden wystarczy napisać następujące:

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

Czy notatka w jaki sposób drugi szablon zastępuje szablon tożsamości (pierwszy) tylko dla elementów o nazwie "Element", które mają atrybut "owoc" z wartością e "jabłko" i atrybut "zwierzę" o wartości "kot". Ten szablon ma puste ciało, co oznacza, że ​​dopasowany element jest po prostu ignorowany (nic nie jest tworzone, gdy jest dopasowany).

Kiedy transformacja ta jest stosowana w następującym dokumencie źródło XML:

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

poszukiwanych wynik jest produkowany:

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

więcej kodu fragmenty używania i przesłanianie szablon tożsamości można znaleźć here.

+13

Mimo że nie zadaję właściwego pytania, odpowiedziałeś dokładnie na pytanie, o co powinienem zapytać! :) – Grundlefleck

+3

Dlaczego więc nie oznaczysz tego postu jako poprawnej odpowiedzi? Wtedy zniknie z listy problemów bez odpowiedzi. –

+2

Musiałem poczekać, aż sprawdziłem, że zadziałało i nie dostałem dzisiaj szansy na pracę. Zrobione teraz, dzięki Dimitre. – Grundlefleck