我有一个乔布斯的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>
我错过了什么?
答案 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'))]]"