鉴于此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
元素。
此xpath
/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!
答案 0 :(得分:1)
XPath表达式选择提供的输入文档中的节点。他们无法对输入文档进行更改。 &#34; root&#34;元素有&#34;演员&#34;作为一个孩子,如果你选择它,它仍然会有&#34;演员&#34;小时候。
同样,如果选择foo:singers元素,它仍然会有&#34; root&#34;作为父母。
显示XPath表达式结果的许多客户端应用程序选择显示以所选节点为根的子树,忽略树中的其他节点。这只是显示结果的一种方式:您需要区分XPath表达式选择的节点与显示结果时屏幕上显示的节点。
如果要创建一个不同的树,其中&#34; root&#34;没有&#34;演员&#34;孩子,你需要XSLT或XQuery。