XPath以排除与多个潜在值匹配的节点

时间:2016-05-05 21:16:30

标签: xml xslt xpath

我有一个乔布斯的XML,我正在尝试编写一个XPath 1.0查询来过滤/排除任何与一组作业标题相匹配的作业。

这是我的XPath:

/jobs/job[Title[not(contains(text(),'Senior') or contains(text(),'Head Of Finance') or contains(text(),'Manager'))]]

它似乎排除了“高级”职位,即“审计高级职位”,但仍然出现标题为“财务负责人”的职位 - 下面是XML的片段:

<?xml version="1.0" encoding="utf-8" ?>
<jobs>
  <job>
    <JobId>3706463</JobId>
    <Category><![CDATA[Health ]]></Category>
    <Views>0</Views>
    <Apps>0</Apps>
    <Title><![CDATA[Head of Finance]]></Title>
    <JobTitleFacet><![CDATA[Finance Manager ]]></JobTitleFacet>
    <Hours><![CDATA[Full Time ]]></Hours>
    <ExperienceLevels><![CDATA[PQ]]></ExperienceLevels>
  </job>
   <job>
    <JobId>3706459</JobId>
    <Views>0</Views>
    <Apps>0</Apps>
    <Title><![CDATA[Audit Senior]]></Title>
    <JobTitleFacet><![CDATA[Audit ]]></JobTitleFacet>
    <ExperienceLevels><![CDATA[PQ]]></ExperienceLevels>
    </job>
  <job>
  <job>
    <JobId>334</JobId>
    <Views>0</Views>
    <Apps>0</Apps>
    <Title><![CDATA[Something Else]]></Title>
    <JobTitleFacet><![CDATA[Audit ]]></JobTitleFacet>
    <ExperienceLevels><![CDATA[PQ]]></ExperienceLevels>
    </job>
  <job>
</jobs>

我错过了什么?

1 个答案:

答案 0 :(得分:2)

这是因为XSLT和XPath区分大小写,因此“财务主管”(“Of”中的大写“O”与“财务主管”不同(小写) “O”)。

如果您使用的是XPATH 1.0,我相信您只能使用translate函数将大写字母转换为小写字母。

试试这个......

/jobs/job[Title[not(
    contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrsuvwxyz') ,'senior') 
    or contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') ,'head of finance') 
    or contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') ,'manager'))]]

注意:在XPath 2.0中,您可以编写如下内容:

jobs/job[Title[not(matches(text(), '(Senior)|(Head Of Finance)|(Manager)', 'i'))]]"