xidel:使用 XQuery 删除节点

问题描述 投票:0回答:1

示例 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'
xml xquery xidel
1个回答
0
投票

找到方法:

xidel --xml -e '
    let $delete := (//innerElement)[2]
    return transform(/, function($e){
        if ($delete[$e is .]) then () else $e
    })
' -e '//innerElement[text()="1234"]' file.xml 

如果可以简化,将接受另一个答案

© www.soinside.com 2019 - 2024. All rights reserved.