示例 XML:
<outerTag>
<innerElement>
<Id>1234</Id>
<fName>Kim</fName>
<lName>Scott</lName>
<customData1>Value1</customData1>
<customData2>Value2</customData2>
<position>North<position>
<title/>
</innerElement>
<innerElement>
<Id>5678</Id>
<fName>Brian</fName>
<lName>Davis</lName>
<customData3>value3</customData3>
<customData4>value4</customData4>
<customData5>value5</customData5>
<position>South<position>
<title/>
</innerElement>
</outerTag>
预期产出:
<outerTag>
<innerElement>
<Id>1234</Id>
<fName>Kim</fName>
<lName>Scott</lName>
<customData1>Value1</customData1>
<customData2>Value2</customData2>
<position>North<position><title/></position>
</position>
</innerElement>
</outerTag>
我从this试过:
xidel --xml -e '
let $element := //innerElement[./Id[text()="1234"]]//innerElement
declare function local:process-xml ($element) {
$element update delete node
}
' file.xml
我得到:
An unhandled exception occurred at $00000000006174CA:
ERangeError: Range check error
$00000000006174CA
$000000000061782C
$0000000000629536
$000000000062E638
$000000000055C12B
或
$ xidel --xquery '
let $element := //innerElement[./Id[text()="1234"]]//innerElement
declare function local:process-xml ($element) {
$element update delete node
}
' file.xml
我得到同样的错误。
xidel
doc的尝试示例:
xidel --xml -e '
let $delete := //innerElement[./Id[text()="1234"]]//innerElement
return transform(/, function($e){ $e[not($delete[$e is .])]})
' file.xml
但它给了我所有的 XML 树,没有删除节点。
与
xmlstarlet
是that简单如:
$ xmlstarlet format --recover file 2>/dev/null |
xmlstarlet ed -d '//innerElement[./Id[text()="1234"]]//innerElement'
找到方法:
xidel --xml -e '
let $delete := (//innerElement)[2]
return transform(/, function($e){
if ($delete[$e is .]) then () else $e
})
' -e '//innerElement[text()="1234"]' file.xml
如果可以简化,将接受另一个答案