使用Xpath选择不同的值

时间:2015-12-21 17:39:19

标签: xpath

我正在使用此Xpath查询 //li[contains(@class, 'cmil_header')]/span[contains(@class, 'cmil_theatre')],此查询的结果是:

Park
Saga Tokey
Latvia
Latvia
Skande
Paramount
Paramount
Paramount
Oslo
Oslo
...

我一直在搜索,我得出的结论是,可以选择使用Xpath选择唯一或不同的nodevalues / items。但我无法让它发挥作用。

我已经管理好能够选择//li[contains(@class, 'cmil_header')][1]/span[contains(@class, 'cmil_theatre')]的特定项目(在这种情况下为Park),我认为//li[contains(@class, 'cmil_header')][distinct-values()]/span[contains(@class, 'cmil_theatre')]可行,但不是。

我的问题: 我的查询将如何重现:

Park
Saga Tokey
Latvia
Skande
Paramount
Oslo
...

编辑:带样本的pastabin http://pastebin.com/a3x7hRFu

2 个答案:

答案 0 :(得分:1)

XPath 1.0解决方案(没有distinct-values函数)依赖于重复的顺序:

//li[contains(@class, 'cmil_header')]/span[contains(@class, 'cmil_theatre') and (not(../preceding-sibling::li[contains(@class, 'cmil_header')]) or ../preceding-sibling::li[contains(@class, 'cmil_header')][1]/span[contains(@class, 'cmil_theatre')]/text() != ./text())]

  • 查找包含li类的所有cmil_header个节点://li[contains(@class, 'cmil_header')]
    • 找到包含span类的子cmil_theatre个节点:/span[contains(@class, 'cmil_theatre') and
      • 其中没有包含li类的前cmil_header个节点:(not(../preceding-sibling::li[contains(@class, 'cmil_header')])
      • 包含li类的上一个cmil_header节点的span节点子节点包含cmil_theatre类:{{1} }
        • or ../preceding-sibling::li[contains(@class, 'cmil_header')][1]/span[contains(@class, 'cmil_theatre')]的文字内容与...的文字内容不同:span
    • ...此/text() !=span

答案 1 :(得分:-1)

  

我想// li [包含(@class,' cmil_header')] [distinct-values()] / span [包含(@class,' cmil_theatre')]会工作,但不是。

不,这是行不通的。我发现很难知道你在想什么。最基本的错误是distinct-values()需要一个参数。更巧妙的是,你似乎并不了解谓词(方括号中的表达式)是如何工作的。

假设您的XPath处理器支持XPath 2.0,那将会起作用

distinct-values(//li[contains(@class, 'cmil_header')]/ span[contains(@class, 'cmil_theatre')])