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 }"
我想从 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 }"