![Suchen und Ersetzen innerhalb der Hierarchie von XML-Dateien](https://rvso.com/image/1497070/Suchen%20und%20Ersetzen%20innerhalb%20der%20Hierarchie%20von%20XML-Dateien.png)
Ich habe etwa 350 XML-Dateien im gesamten /abc
Verzeichnis verteilt. Ich möchte alle Instanzen finden, bei denen der Wert des Alt-Attributs genau 'bla bla':
<image alt="blah blah" src="../webcontent/filename.png">
<caption>
Figure 1.1: Typical Components of Blah Blah
</caption>
</image>
und ersetzen Sie den Wert des alt
Attributs durch den darin eingeschlossenen Inhalt caption
(Entfernen von Zeilenumbrüchen).
<image alt="Figure 1.1: Typical Components of Blah Blah" src="../webcontent/filename.png">
<caption>
Figure 1.1: Typical Components of Blah Blah
</caption>
</image>
Ich bin bereit, ein Skript unter Ubuntu oder Windows auszuführen oder ein beliebiges Textbearbeitungstool zu verwenden.
Man kann nicht davon ausgehen, dass Zeilenumbrüche und Einrückungen konsistent sind. Außerdem haben nicht alle Bilder eine Beschriftung. Alle XML-Dokumente im Pfad sind wohlgeformt.
Gibt es eine einfache Möglichkeit, diesen Ersatz direkt per Skript zu erstellen? Ich wäre offen für etwas, das für eine einzelne Datei funktioniert; ich kann es erweitern, sodass es rekursiv ausgeführt wird.
Antwort1
Für eine einzelne Datei erledigt das folgende XSLT-Stylesheet die Aufgabe:
<t:transform version="1.0" xmlns:t="http://www.w3.org/1999/XSL/Transform">
<t:template match="node()|@*">
<t:copy>
<t:apply-templates select="node()|@*"/>
</t:copy>
</t:template>
<t:template match="image/@alt[. = 'blah blah']">
<t:attribute name="alt" select="normalize-space(../caption)"/>
</t:template>
</t:transform>
Um mehrere Dateien zu verarbeiten, können Sie das Stylesheet mehrmals von einem Shell-Skript, Ant-Skript oder Ähnlichem aus aufrufen (oder schauen Sie sich xmlsh an), oder wenn Sie einen XSLT 2.0-Prozessor wie Saxon verwenden, können Sie es innerhalb von XSLT selbst mit der Funktion collection() skripten.
Antwort2
Sie könnten auch verwenden xmlstarlet
:
xmlstarlet ed -u '//image/@alt[.= "blah blah"]' -x "normalize-space(../caption/text())"