我想使用xmlstarlet查找包含属性inkscape:label =“L2”的xml文件的元素,并将其属性“style”设置为值“display.inline”。难点在于属性“样式”可能已经定义,也可能尚未定义。
我目前正在使用此命令:
xmlstarlet edit --inplace --update "//*[@inkscape:label=\"L2\"]/@style" --value "display:inline" ex.svg
如果已经定义了属性样式,它将起作用
// It works on this
<g inkscape:groupmode="layer"
id="layer2"
inkscape:label="L2"
style="display:none">
但不会起作用:
// Does not work
<g inkscape:groupmode="layer"
id="layer2"
inkscape:label="L2">
我还定义了一个能够添加所需属性的命令:
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">
有没有办法创建属性,如果它不存在,否则编辑它?
答案 0 :(得分:2)
您可以同时使用--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