xmlstarlet: So wählen Sie das Tag unmittelbar vor dem ausgewählten Tag aus

xmlstarlet: So wählen Sie das Tag unmittelbar vor dem ausgewählten Tag aus

Ich durchsuche Scribus-SLA-Dateien und möchte den Text mit bestimmten Absatzstilen finden. Das SLA-Dateiformat ist ein ziemlich flaches XML-Format und enthält mehrere Absätze in einer Reihe, die jeweils durch Tags mit einem Absatzstilattribut getrennt sind <trail/>. <para/>Ich kann das <StoryText>Objekt erreichen, das eines davon enthält, aber ich muss das <ITEXT>unmittelbar davor stehende Tag erreichen, da dessen CH-Attribute den gesuchten Text enthalten.

So erreiche ich den enthaltenen StoryText:

xmlstarlet sel -t -c "SCRIBUSUTF8NEW/DOCUMENT/PAGEOBJECT/StoryText [para/@PARENT='SearchedStyle']" myfile.sla

Es ergibt sich beispielsweise:

<StoryText>
    <DefaultStyle/>
    <ITEXT CH="Et main&#xAD;te&#xAD;nant"/>
    <breakline/>
    <ITEXT CH="qu&#x2019;est ce qu&#x2019;on fait&#x202F;?"/>
    <para PARENT="SomeOtherParagraphStyle"/>
    <para/>
    <ITEXT CH="The Calendar"/>
    <trail PARENT="SearchedStyle"/>
</StoryText>

Ich kann das auch erreichen, <trail PARENT="SearchedStyle"/>aber wie kann ich den <ITEXT CH="The Calendar"/>Knoten erreichen?

Antwort1

Ich bin nicht sicher, ob das die beste Lösung ist, aber so habe ich es geschafft:

xmlstarlet sel -t -c "SCRIBUSUTF8NEW/DOCUMENT/PAGEOBJECT/StoryText/trail[@PARENT='SearchedStyle']/preceding-sibling::ITEXT[1]" myfile.sla

Und um seinen CHAttributwert zu erhalten:

xmlstarlet sel -t -v "SCRIBUSUTF8NEW/DOCUMENT/PAGEOBJECT/StoryText/trail[@PARENT='SearchedStyle']/preceding-sibling::ITEXT[1]/@CH" myfile.sla

Wow

verwandte Informationen