XPath 删除单个节点(通过 Saxon CLI)

XPath remove single node (via Saxon CLI)

我想从 XML 文件中删除一个节点(使用 SaxonHE9-8-0-11J):

<project name="Build">
  <property name="src" value="src/main/resources" />
  <property name="target" value="target/classes" />

  <condition property="target.exists">
    <available file="target" />
  </condition>
</project>

显然我有两种方法 do this。 XPath1:使用非函数 XPath2:使用 except 子句。但是两者都只是 return 整个节点集。

有一个 not 函数:

saxonb-xquery -s:test.xml -qs:'*[not(local-name()="condition")]'

带有 except 子句:

saxonb-xquery -s:test.xml -qs:'* except condition'

使用 -explain 开关查询是:

<query>
  <body>
    <filterExpression>
      <axis name="child" nodeTest="element()"/>
      <operator op="ne (on empty return true())">
        <functionCall name="local-name">
          <dot/>
        </functionCall>
        <literal value="condition" type="xs:string"/>
      </operator>
    </filterExpression>
  </body>
</query>

<query>
  <body>
    <operator op="except">
      <axis name="child" nodeTest="element()"/>
      <path>
        <root/>
        <axis name="descendant" nodeTest="element(condition, xs:anyType)"/>
      </path>
    </operator>
  </body>
</query>

一般来说,XPath select 来自一个或多个输入文档的节点,它不允许您构造新的节点,因为您需要 XSLT 或 XQuery。并删除 project 根的 condition 子项,如果这是您想要实现的,那么即使您使用 /*/(* except condition),您也需要使用 XSLT 或 XQuery 使用 XPath然后获取除 condition 元素之外的所有子元素,但作为一个序列,不包含在根中。

因此对于 XQuery,您可以使用

/*/element {node-name()} { * except condition }

作为一种紧凑但通用的方法来重建具有除 condition 之外的所有子元素的任何根:https://xqueryfiddle.liberty-development.net/948Fn5b

是否通过命令行获得这样的表达式 shell 是一个不同的问题,在 Windows 上使用 Powershell window 和 cmd shell 它适合我使用

-qs:"/*/element {node-name()} { * except condition }"