xmlstarlet как выбрать тег непосредственно перед выбранным тегом

xmlstarlet как выбрать тег непосредственно перед выбранным тегом

Я сканирую файлы SLA scribus и хочу найти текст, имеющий определенные стили абзацев. Формат файла SLA — это довольно плоский формат XML, в котором в строке находится несколько абзацев, каждый из которых разделен тегами <trail/>или <para/>с атрибутом стиля абзаца. Я могу добраться до <StoryText>объекта, содержащего один из них, но мне нужно добраться до тега, <ITEXT>который идет непосредственно перед ним, потому что его атрибуты CH содержат текст, который я ищу.

Вот как я добираюсь до содержащего StoryText:

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

Например, получается:

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

Я также могу добраться до узла, <trail PARENT="SearchedStyle"/>но как мне добраться до <ITEXT CH="The Calendar"/>него?

решение1

Не уверен, что это лучшее решение, но вот как мне удалось это сделать:

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

И чтобы получить CHзначение его атрибута:

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

Ух ты!

Связанный контент