xmlstarlet como selecionar a tag imediatamente antes da tag selecionada

xmlstarlet como selecionar a tag imediatamente antes da tag selecionada

Eu digitalizo arquivos SLA do scribus e desejo encontrar o texto com alguns estilos de parágrafo específicos. O formato de arquivo SLA é um formato XML bastante simples e há vários parágrafos seguidos, cada um separado por tags <trail/>ou <para/>com um atributo de estilo de parágrafo. Posso alcançar o <StoryText>objeto que contém um deles, mas preciso alcançar a tag <ITEXT>que vem imediatamente antes dele porque seus atributos CH contêm o texto que estou procurando.

Aqui está como eu alcanço o StoryText que contém:

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

Produz por exemplo:

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

Também posso chegar ao nó <trail PARENT="SearchedStyle"/>, mas como posso chegar ao <ITEXT CH="The Calendar"/>nó?

Responder1

Não tenho certeza se é a melhor solução, mas aqui está como consegui fazer isso:

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

E para obter CHo valor do seu atributo:

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

Uau

informação relacionada