如何忽略 XPath 1.0 中的名称空间?
How to ignore namespaces in XPath 1.0?
我在尝试理解 XPath 的魔力时遇到了严重的问题。
基本上,我有一些 XML 像这样:
<a>
<b>
<c/>
</b>
</a>
现在,我想数一数我们有多少个 B,没有 C。这可以使用以下 XPath 轻松完成:
count(*/b[not(descendant::c)])
现在的问题很简单:我如何做同样的事情,同时忽略任何名称空间?
我猜是这样的?
count(*/[local-name()='b']/[not(descendant::[local-name()='c'])])
但这是不正确的。什么是我上面的等效 XPath,但它忽略了名称空间?
给定的 XPath,
count(*/b[not(descendant::c)])
可以重写为忽略命名空间,如下所示:
count(*[local-name()='b' and not(descendant::*[local-name()='c'])])
请注意,通常最好不要破坏命名空间,而是通过分配命名空间前缀并在 XPath 表达式中使用它们来正确使用它们。
我在尝试理解 XPath 的魔力时遇到了严重的问题。
基本上,我有一些 XML 像这样:
<a>
<b>
<c/>
</b>
</a>
现在,我想数一数我们有多少个 B,没有 C。这可以使用以下 XPath 轻松完成:
count(*/b[not(descendant::c)])
现在的问题很简单:我如何做同样的事情,同时忽略任何名称空间?
我猜是这样的?
count(*/[local-name()='b']/[not(descendant::[local-name()='c'])])
但这是不正确的。什么是我上面的等效 XPath,但它忽略了名称空间?
给定的 XPath,
count(*/b[not(descendant::c)])
可以重写为忽略命名空间,如下所示:
count(*[local-name()='b' and not(descendant::*[local-name()='c'])])
请注意,通常最好不要破坏命名空间,而是通过分配命名空间前缀并在 XPath 表达式中使用它们来正确使用它们。