
XML ドキュメントである SVG ファイルがあります。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
<defs
id="defs2">
<!-- a lot of stuff> </defs>
<!-- more stuff-->
</svg>
次の出力を得るために、デフォルトの名前空間に対応するすべてのタグに svg: プレフィックスを追加します。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg:svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
<svg:defs
id="defs2">
<!-- a lot of stuff> </svg:defs>
<!-- more stuff-->
</svg:svg>
これはシェルから1行または数行のコマンドラインで実行できるはずです。xmllintおよび/またはxmlスターレットしかし、私はそれを管理することができません。
答え1
しばらくお聞きになっていませんが、それでも...
xmlstarlet edit
の-r
/--rename
アクションでは、新しい名前にリテラル値が必要なので、XPath 関数は使用できません。ただし、xmlstarlet select
編集コマンドを生成するコード ジェネレーターとして使用できます。
xmlstarlet select -t \
--var sq -o "'" -b \
-o 'xmlstarlet edit --pf \' -n \
-m 'set:distinct(//_:*)' \
-o ' -r ' -v 'concat($sq,"//_:",local-name(),$sq)' \
-o ' -v ' -v 'concat($sq,"svg:",local-name(),$sq)' -o ' \' -n \
-b \
-f -n \
file.xml
どこ
- この
//_:*
式は、デフォルトの名前空間内のすべての要素ノードに一致します(_
ショートカットはxmlstarlet
ユーザーガイド) - EXSLT関数
set:distinct
重複を排除する -o
文字列リテラル、-n
改行、-f
入力パス名/URL(ただし-
stdin用)を出力します。-b
現在のコンテナを終了します (-m
、--var
なし=
、ao)- 生成されたXSLTコードをリストする
-C
前にオプションを追加する-t
出力:
xmlstarlet edit --pf \
-r '//_:svg' -v 'svg:svg' \
-r '//_:defs' -v 'svg:defs' \
file.xml
どこ
-P
/--pf
元の書式を保持-L
の後に/--inplace
オプションを追加すると、edit
インプレース編集がサポートされます(ユーザーガイドには記載されていませんが、 xmlstarlet.txt)
出力をシェル スクリプトとして実行するには:
xmlstarlet-select-command | sh -s > result.xml
EXSLT を避けたい場合は、代わり-m '//_:*' --sort 'A:T:-' .
に を介して出力をパイプするuniq
か、単に-m '//_:*'
重複の可能性を含めます。
答え2
xmlstarlet
特に残酷な方法で使用する(適切なxpathを待ちます)
for x in $(xmlstarlet sel -t -m "//*" -n -v "name()" file1.xml | sort | uniq); do
xmlstarlet ed -r "//svg:$x" -v "svg:$x" file1.xml > tmp.xml;
mv tmp.xml file1.xml;
done
名前空間はすでに宣言されているため、ノード名のリテラル値を変更するにsvg
は、それを で呼び出す必要があります。xpath