给定此 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。