【问题标题】:XPath to exclude nodes that match multiple potential valuesXPath 排除匹配多个潜在值的节点
【发布时间】:2016-05-05 21:16:30
【问题描述】:

我有一个工作的 XML,并且正在尝试编写一个 XPath 1.0 查询来过滤/排除与某个职位的特定职位集匹配的任何职位。

这是我的 XPath:

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

它似乎排除了带有“高级”的职位,即“高级审计”,但标题为“财务主管”的职位仍然出现 - 以下是 XML 的 sn-p:

<?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>

我错过了什么?

【问题讨论】:

  • XSLT 和 XPath 区分大小写,因此“财务主管”(“Of”中带有大写“O”)与“财务主管”(带有小写-case "o")。
  • SMH!谢谢!作为选择的一部分,有没有办法不区分大小写?请随意回答问题,以便我将您标记为正确!
  • 跟进 - 我可以将它与另一个声明结合起来吗:/jobs/job[Title[not(contains(text(),'Senior') or contains(text(),'Head of') or contains(text(),'Manager'))]] | /jobs/job[ExperienceLevels[normalize-space()='Entry Level' or normalize-space()='PQ' or normalize-space()='NQ']]
  • 好吧,试一试,看看你得到了什么......(如果它没有按预期工作,请随时提出一个全新的问题。阅读起来有点困难仅在 cmets 中的代码)。谢谢!

标签: xml xslt xpath


【解决方案1】:

这是因为 XSLT 和 XPath 区分大小写,因此“Head Of Finance”(“Of”中带有大写“O”)与“Head of Finance”(带有小写"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'))]]" 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    相关资源
    最近更新 更多