xmlstarlet 選択したタグの直前のタグを選択する方法

xmlstarlet 選択したタグの直前のタグを選択する方法

Scribus SLA ファイルをスキャンして、特定の段落スタイルを持つテキストを見つけたいと考えています。SLA ファイル形式は非常にフラットな XML 形式で、複数の段落が連続して存在し、各段落は段落スタイル属性を持つ<trail/>またはタグで区切られています。これらのいずれかを含むオブジェクトにはアクセスできますが、その CH 属性に探しているテキストが含まれているため、その直前のタグにアクセスする必要があります。<para/><StoryText><ITEXT>

含まれる 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

うわあ

関連情報