使用 xpath 表达式排除节点及其子节点



给定此 xml

<root xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org">
<actors>
<actor id="1">Christian Bale</actor>
<actor id="2">Liam Neeson</actor>
<actor id="3">Michael Caine</actor>
</actors>
<foo:singers>
<foo:singer id="4">Tom Waits</foo:singer>
<foo:singer id="5">B.B. King</foo:singer>
<foo:singer id="6">Ray Charles</foo:singer>
</foo:singers>
</root>

我想排除actors和所有actor元素。

此通道

/root/*[not(self::actors)] 

返回

<foo:singers xmlns:foo="http://www.foo.org/">
<foo:singer id="4">Tom Waits</foo:singer>
<foo:singer id="5">B.B. King</foo:singer>
<foo:singer id="6">Ray Charles</foo:singer>
</foo:singers>

而我想要

<root xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org">
<foo:singers>
<foo:singer id="4">Tom Waits</foo:singer>
<foo:singer id="5">B.B. King</foo:singer>
<foo:singer id="6">Ray Charles</foo:singer>
</foo:singers>
</root>
  • 使用/*[not(self::actors)]返回整个文档而不删除任何内容。
  • 使用/*[not(descendant-or-self::actors)]在 https://www.freeformatter.com/xpath-tester.html 返回测试服务NO MATCH!

XPath 表达式选择提供的输入文档中的节点。他们无法对输入文档进行更改。"root"元素在子元素时有"actor",如果选择它,它仍然会有"actor"作为子元素。

同样,如果选择 foo:singers 元素,它仍将具有"root"作为父元素。

许多显示 XPath 表达式结果的客户端应用程序选择显示根植于所选节点的子树,而忽略树中的其他节点。这只是显示结果的一种方式:您需要将 XPath 表达式选择的节点与显示结果时屏幕上显示的节点区分开来。

如果要创建"根"没有"参与者"子项的其他树,则需要 XSLT 或 XQuery。

相关内容

  • 没有找到相关文章

最新更新