Я сканирую файлы 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­te­nant"/>
<breakline/>
<ITEXT CH="qu’est ce qu’on fait ?"/>
<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
Ух ты!