我有一个带有以下xmlns的根元素;
<Status xmlns="http://www.tandberg.com/XML/CUIL/2.0" product="TANDBERG Codec" version="1.0.0">
它没有xmlns的简称 - 但我需要使用xpath查询文档以获取信息。我无法编辑xml文档本身。
我使用各种解析器,有些能够处理没有短名称的xmlns,有些则不能。
下面的xpath将为我提供我需要的数据 - 问题是 - 如果xpath在上述场景中被设计破坏了吗?
//*[local-name()='Hardware']/*[local-name()='Temperature']
IE:如果不添加xmlns,Notepad ++将无法处理它:xs =&#34; ...&#34; 以下网站处理它并给我我期望的。 http://www.xpathtester.com/xpath
哪个是正确的实施?
答案 0 :(得分:2)
短名称表示名称空间前缀。
XPath本身没有将名称空间前缀绑定到名称空间的机制。您必须依赖XPath的更大上下文(XSLT或其他托管语言)来声明名称空间前缀和名称空间之间的连接。
您的local-name()
方法应该适用于任何一致的XPath实现。它通常在纯XPath问题的答案中提供,否则不会说明XPath上下文或库。不幸的是,它也是由那些不理解或不必要地避开命名空间的人提供的。
理想情况下,当知道XPath的托管上下文时,应正确声明和使用名称空间前缀,而不是通过local-name()
回避。
答案 1 :(得分:1)
函数local-name()
位于XPath 1.0规范的4.1节中。第4节是核心函数库。其中列出的每个函数都必须包含在所有XPath实现中。如果Notepad ++不支持它,那么它是一个不符合要求的处理器。
当没有名称空间前缀时使用local-name()
不应该破坏任何XPath。
但是,最好还使用namespace-uri()
来匹配您打算匹配的确切节点。它非常详细,但也非常准确。
示例:
//*[local-name()='Hardware' and namespace-uri()='http://www.tandberg.com/XML/CUIL/2.0']/*[local-name()='Temperature' and namespace-uri()='http://www.tandberg.com/XML/CUIL/2.0']