2017-12-14 26 views
1

私は属性のInkscapeを含むXMLファイルの要素を見つけるためにxmlstarletを使用したいの編集:ラベル=「L2」を、その属性「スタイル」を設定値 "display.inline"に設定します。難しいのは、属性「スタイル」が既に定義されているかどうかではないということです。属性のスタイルがすでに xmlstarlet:それが存在しない場合は、属性を作成し、それ以外

// It works on this 
<g inkscape:groupmode="layer" 
id="layer2" 
inkscape:label="L2" 
style="display:none"> 

を定義されている場合

xmlstarlet edit --inplace --update "//*[@inkscape:label=\"L2\"]/@style" --value "display:inline" ex.svg 

それは動作しますが、それはそうでない場合は動作しません:

// Does not work 
<g inkscape:groupmode="layer" 
id="layer2" 
inkscape:label="L2"> 

Iを

私は現在、このコマンドを使用していますまた、所望の属性を追加することを可能にするコマンドを定義した:

xmlstarlet ed --insert "//*[@inkscape:label=\"L2\"]" --type attr -n style -v "display:inline" ex.svg > output.svg 

属性がすでに存在する場合は残念ながら、もう一つは追加されます。

// The element now contains two attributes style 
<g inkscape:groupmode="layer" 
id="layer2" 
inkscape:label="L2" 
style="display:none" 
style="display:inline"> 

は、それが存在しない、そうでなければ、それを編集する場合は、属性を作成する方法はありますか?

答えて

1

--update--insertの両方を使用できますが、要素にstyle属性(not(@style))がない場合にのみ挿入できます。

例:

xmlstarlet edit --inplace --update "//*[@inkscape:label=\"L2\"]/@style" --value "display:inline" --insert "//*[@inkscape:label=\"L2\"][not(@style)]" --type attr -n style -v "display:inline" ex.svg 
関連する問題