xpath轴中的命名空间是什么

时间:2016-03-16 09:47:45

标签: xml xpath

我正在研究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 ;.在哪里以及在哪种情况下它是有用的

2 个答案:

答案 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/']

同时选择BASENEXT元素。这种用法被认为有点奇怪,不推荐使用。

//*[local-name(.) eq 'p' and namespace::*='http://purl.org/dc/elements/1.1/']

选择所有p元素,也就是base:pdc:pp

//*[local-name(.) eq 'p' and namespace::dc]

选择base:p元素的dc:pBASE

//*[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 是可行的解决方案。但是,我认为下一个信息也很有用: