Jak usunąć elementy z xml za pomocą XSLT z arkusza stylów i xsltproc?

Mam wiele plików XML, które mają coś w postaci:

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

Które chcę usunąć z pliku.

Używając arkusza stylów XSLT i linuksowego narzędzia xsltproc, Jak mogę to zrobić?

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


EDIT: pytanie pierwotnie brakowało w intencja.

To, 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 pozostały. So

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

Stałoby się:

<Element fruit="orange" animal="dog" />
<Element fruit="pear"   animal="wild three eyed mongoose of kentucky" />
Author: Dimitre Novatchev, 2008-11-26

2 answers

Używając jednego z najbardziej fundamentalnych wzorców projektowych XSLT: "Overriding the transformacja tożsamości" wystarczy napisać:

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

Zwróć uwagę Jak drugi szablon nadpisuje szablon identity (1st) tylko dla elementów o nazwie "Element", które mają atrybut "fruit" z wartością " apple "i atrybut" animal "z wartością"cat". Ten szablon ma puste ciało, co oznacza, że dopasowany element jest po prostu ignorowany (nic nie jest generowane, gdy jest dopasowane).

Gdy ta transformacja jest zastosowana w następującym źródłowym dokumencie 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>

Oczekiwany wynik jest wytwarzany:

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

Więcej fragmentów kodu dotyczących używania i nadpisywania szablonu tożsamości można znaleźć proszę..

 134
Author: Dimitre Novatchev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-03 15:10:52

Odpowiedź @ Dimitre Novatchev jest z pewnością poprawna i elegancka, ale istnieje uogólnienie (o które OP nie pytał): co jeśli element, który chcesz filtrować, ma również elementy potomne lub tekst, który chcesz zachować?

Wydaje mi się, że ta drobna odmiana pokrywa ten przypadek:

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

Warunek dopasowania może być skomplikowany, aby określić inne atrybuty itp. i możesz użyć wielu takich szablonów, jeśli upuszczasz inne rzeczy.

Więc to wejście:

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

Produkuje to wyjście:

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

Kredyt na XSLT Cookbook .

 3
Author: Sboisen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-08 21:53:57