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
count
span
- 子を持つノード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>