xmlstarletの移動はどのように機能しますか?

xmlstarletの移動はどのように機能しますか?

XML文書の要素を移動したいです。xmlstarlet

特に、次のように変更したいと思います。

<parent>
    <before/>
    <span><a>blah</a></span>
    <after/>  
<parent>
<otherparent>
    <span><a>blah</a></span>
<otherparent>

になる..

<parent>
    <before/>
    <a>blah</a>
    <after/>
</parent>
<otherparent>
    <a>blah</a>
</otherparent>

つまり、範囲を削除し、子を保持します。

xmlstarletには移動コマンドがあります。xmlstart ed -m source targetしかし、私はそれがどのように機能するのかよく理解していません。

ソースxpathとターゲットxpathが必要ですが、異なるサイズのコレクションを作成できるため、それらがどのように一致するのかわかりません。ターゲットはソースに相対的ですか?

ベストアンサー1

複雑xmlstarlet解決策:

XMLファイルを入力してくださいtest.xml

<div>
  <parent>
    <before/>
    <span>
      <a>value 1</a>
    </span>
    <after/>
  </parent>
  <otherparent>
    <span>
      <a>value 2</a>
    </span>
  </otherparent>
</div>

働く:

count=$(xmlstarlet sel -t -v 'count(//span[a])' test.xml)
for ((i=1; i<=$count; i++)); do 
    xmlstarlet ed -L -a '(//span[a])[1]' -t elem -n "a" -v "$(xmlstarlet sel -t -v "(//span/a)[1]" 1.xml)" -d '(//span[a])[1]' test.xml
done

  • countspan- 子を持つノードaの数を含む変数

  • ed- 編集モード

  • -L- ファイルを所定の位置に修正

  • -a- 追加措置

  • -d- 削除操作


最終test.xml(処理後):

<?xml version="1.0"?>
<div>
  <parent>
    <before/>
    <a>value 1</a>
    <after/>
  </parent>
  <otherparent>
    <a>value 2</a>
  </otherparent>
</div>

おすすめ記事