xmlstarlet cómo seleccionar la etiqueta inmediatamente antes de la etiqueta seleccionada

xmlstarlet cómo seleccionar la etiqueta inmediatamente antes de la etiqueta seleccionada

Escaneo archivos SLA de scribus y deseo encontrar el texto que tenga algunos estilos de párrafo específicos. El formato de archivo SLA es un formato XML bastante plano y hay varios párrafos seguidos, cada uno de los cuales está separado por etiquetas <trail/>o <para/>que tienen un atributo de estilo de párrafo. Puedo alcanzar el <StoryText>objeto que contiene uno de estos, pero necesito llegar a la etiqueta <ITEXT>que viene inmediatamente antes porque sus atributos CH contienen el texto que estoy buscando.

Así es como llego al StoryText que lo contiene:

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

Produce por ejemplo:

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

También puedo llegar al nodo <trail PARENT="SearchedStyle"/>, pero ¿cómo puedo llegar al <ITEXT CH="The Calendar"/>nodo?

Respuesta1

No estoy seguro de que sea la mejor solución, pero así es como logré hacerlo:

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

Y para obtener CHel valor de su atributo:

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

Guau

información relacionada