我正在研究XPath Axes,我能够理解以下所有轴
'祖先'
| '祖先或自身'
| '属性'
| '儿童'
| '后代'
| '后代或自身'
| '以下'
| '以下同胞'
| '父'
| '前述'
| '&#39同胞前述;
| '自'
我无法理解的唯一轴是
| '命名空间'
任何人都可以给我一个很好的例子,并了解什么'命名空间'实际上呢?
实施例: -
开放: - https://www.google.co.in/
OR
HTML代码
<a style="left:-1000em;position:absolute" href="/setprefs?suggon=2&prev=https://www.google.co.in/&sig=0_ujdR1PrGxEbi_EiD6RbIb4VvaXc%3D">Screen-reader users, click here to turn off Google Instant.</a>
我正在尝试下面的xpath
//a[@style='left:-1000em;position:absolute']/namespace::*[name()='google']
我在上面的命名空间中做了什么错误?
另外我还想知道轴的用途是什么&#39;属性&#39 ;.在哪里以及在哪种情况下它是有用的
答案 0 :(得分:3)
namespace::
轴选择 namespace nodes 。没有什么花哨。
命名空间节点 ,根据链接的规范包括:
名称以xmlns:
名称以xmlns:
开头的祖先元素上的每个属性,除非元素本身或更近的祖先重新声明前缀
xmlns
属性,如果元素或某个祖先具有xmlns
属性,并且最近的此类元素的xmlns
属性值为非空< / p>
例如,给定以下XML元素:
<a xmlns:google="some namespace uri here"/>
下面的XPath表达式将返回xmlns:google
属性 [demo] 。 :
//a/namespace::*[name()='google']
此示例对应于上面提到的第一个项目符号点,因为xmlns:google
是属性,位于上下文元素<a>
上,其名称以xmlns:
开头。
类似的解释适用于attribute
轴;它只是选择XML属性。
您可以将attribute
轴视为您已使用的@
的较长版本。例如,下面的两个表达式意思相同:
//a[attribute::style='left:-1000em;position:absolute']
//a[@style='left:-1000em;position:absolute']
答案 1 :(得分:1)
根据逻辑,它应该选择与命名空间相关的所有元素。但是,它的行为有点复杂,因此不经常使用。 (它被认为在XPath 2.0中已弃用。)
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<BASE xmlns:base="http://www.tei-c.org/ns/1.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<base:p>XXX</base:p>
<dc:p>yyy</dc:p>
</BASE>
<NEXT xmlns="http://purl.org/dc/elements/1.1/">
<p>zzz</p>
</NEXT>
</ROOT>
XPath(2.0):
//*[namespace::dc]
选择整个BASE
元素。它类似于:
//*[namespace-uri-for-prefix('dc', .)]
在XPath 1.0中不起作用。
//*[namespace::*='http://purl.org/dc/elements/1.1/']
同时选择BASE
和NEXT
元素。这种用法被认为有点奇怪,不推荐使用。
//*[local-name(.) eq 'p' and namespace::*='http://purl.org/dc/elements/1.1/']
选择所有p
元素,也就是base:p
,dc:p
,p
。
//*[local-name(.) eq 'p' and namespace::dc]
选择base:p
元素的dc:p
和BASE
。
//*[local-name(.) eq 'p' and namespace-uri() eq 'http://purl.org/dc/elements/1.1/']
选择与URI绑定的所有元素。这意味着它是最准确的选择。
或者可以尝试类似:
//*[contains(namespace-uri(), 'purl')]
或
//self::BASE/*[contains(namespace-uri(), 'purl')]
在Oxygen Author 17.1中测试
<强>更新强>
根据您的需要,您似乎可能尝试在google
属性中选择字符串为href
的元素,而不是特定的命名空间。那么//a[contains(@href, 'google')]
呢?
更新II
正如评论中所述, UPDATE 是可行的解决方案。但是,我认为下一个信息也很有用: