使用XPath按多个值过滤

时间:2016-04-15 19:53:42

标签: ruby xml xpath nokogiri

我正在尝试按公司名称过滤作业的XML文档。

我可以使用以下方式提取与特定公司名称匹配的所有项目:

doc.xpath("/source/job[company[text() = 'BigCorp' or text() = 'MegaCorp']]")

我无法做相反的事情并使用以下内容排除这些值:

doc.xpath("/source/job[company[text() != 'Hodes' or text() != 'Scurri']]")

我哪里错了?有没有办法提供以逗号分隔的值列表?

1 个答案:

答案 0 :(得分:3)

尝试将or更改为and

doc.xpath("/source/job[company[text() != 'Hodes' and text() != 'Scurri']]")

如果您使用or,它将始终返回作业。

例如,它会返回公司Hodes的作业,因为text() != 'Scurri'为真(反之亦然)。

关于以下评论:

  

所以normalize-space()做到了!   doc.xpath("/source/job[company[normalize-space() != 'Hodes' and normalize-space() != 'Scurri']]")不确定原因?

normalize-space()工作的原因是因为text()也会返回空格。

例如,如果你有一个像:

这样的元素
<company>
 Hodes
</company>

或:

<company> Hodes </company>

text()等于&#34; _Hodes_&#34;。 (我用_替换了空格,以便更容易看到。)

由于空白,&#34; _Hodes_&#34;不等于&#34; Hodes&#34;。

使用normalize-space()将删除前导/尾随空格,并用一个空格替换多个空格。