Domanda

Ho molti file XML che hanno qualcosa del formato:

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

Che voglio essere rimosso dal file.

Utilizzando un foglio di stile XSLT e l'utilità della riga di comando di Linux xsltproc, come potrei farlo?

A questo punto dello script ho già l'elenco dei file che contengono l'elemento che desidero rimuovere, quindi il singolo file può essere utilizzato come parametro.


EDIT: la domanda inizialmente non era intenzionale.

Quello che sto cercando di ottenere è rimuovere l'intero elemento "Elemento" dove (frutto == " mela " & amp; & amp; animal == " cat "). Nello stesso documento ci sono molti elementi chiamati " Element " ;, vorrei che rimanessero. Quindi

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

Diventerebbe:

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

Soluzione

Utilizzando uno dei modelli di progettazione XSLT più fondamentali: " Sostituzione di trasformazione dell'identità " uno scriverà semplicemente quanto segue:

<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 come il secondo modello sovrascrive il modello identità (1 °) solo per gli elementi denominati " Elemento " che hanno un attributo "frutta" con valore "mela" e attribuire "animale" con valore "cat". Questo modello ha un corpo vuoto, il che significa che l'elemento corrispondente viene semplicemente ignorato (non viene prodotto nulla quando viene associato).

Quando questa trasformazione viene applicata al seguente documento XML di origine:

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

viene prodotto il risultato desiderato:

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

È possibile trovare altri frammenti di codice di utilizzo e sostituzione del modello di identità qui .

Altri suggerimenti

La risposta di @Dimitre Novatchev è certamente sia corretta che elegante, ma c'è una generalizzazione (che l'OP non ho chiesto informazioni): cosa succede se l'elemento che si desidera filtrare ha anche elementi figlio o testo che si desidera conservare ?

Credo che questa variazione minore riguardi quel 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 condizione di corrispondenza può essere complicata per specificare altri attributi, ecc., e puoi usare più di questi modelli se lasci cadere altre cose.

Quindi questo input:

<?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 questo output:

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

Ringraziamo Cookbook XSLT .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top