2017-03-12 2 views
1

diese Daten Gegeben zur Liste:Wie alle möglichen übergeordneten Elemente eines untergeordneten Elements in xmlstarlet

<root> 
    <A> 
    <A1 id="1"> 
     <elem>apple</elem> 
    </A1> 
    </A> 

    <B> 
    <B1 id="2"> 
     <elem>banana</elem> 
    </B1> 
    </B> 

    <C id="3"> 
    <elem>grapes</elem> 
    <C1></C1> 
    </C> 
</root> 

Wie kann ich alle möglichen übergeordneten Elemente des Elements Elem herausfinden? Bisher bin ich in der Lage -m Option, um herauszufinden, mit von:

$ xmlstarlet sel -t -m '//elem/..' -v 'concat(name(),"=",@id)' -n input3.xml 
A1=1 
B1=2 
C=3 

$ 

Aber wie mache ich das gleiche mit -v ein XPath Ausdruck verwenden? Zum Beispiel kann ich zum id Attribut der Eltern beziehen sich nur, aber nicht den Namen des Elternelement:

$ xmlstarlet sel -t -v '//elem/../@id' input3.xml 
1 
2 
3 
$ 

Antwort

2

könnten Sie tun:

xmlstarlet sel -t -v "name(//elem/..)" input3.xml 

aber das wird nur Sie den Namen der geben, erste Übereinstimmung (xmlstarlet ist ein XPath 1.0-Prozessor).

Der einzige Weg, dies zu tun, wie Sie, ist durch passende (-m) zuerst:

xmlstarlet sel -t -m "//*[elem]" -v "name()" -n input3.xml 
+0

Danke:

xmlstarlet sel -t -m "//elem/.." -v "name()" -n input3.xml 

obwohl ich eine etwas andere XPath bevorzugen würden. Es klappt. Ich werde noch ein paar Tage warten, damit nicht andere Ideen aufkommen und dann werde ich diese Antwort akzeptieren. – ifelsemonkey

+0

@daixtr - Bitte beachten Sie, dass Sie diese Antwort akzeptieren. Wenn eine bessere Antwort gepostet wird, können Sie jederzeit ändern, welche Antwort angenommen wird. –

Verwandte Themen