不区分大小写的搜索 - xpath

时间:2013-07-05 13:29:25

标签: xml perl xpath

我正在尝试使用下面的XPath表达式对我的XML文档进行不区分大小写的搜索。显然,我错了,因为结果不同。希望有人在这里指出我的错误?

我正在尝试计算<Sect> <Header>值为主要目标的所有Obj元素。为了获得计数,我使用下面的表达方式,这非常有用。

表达式 - 不区分大小写:返回31个节点。

("count(//TaggedPDF-doc//Part//Sect//Sect//Sect[contains(Header,\"Primary objectives\")]//OBJ)");

但我想让“主要目标”不区分大小写。所以,我试图使用Translate。 表达式 - 添加翻译以使“主要目标”不区分大小写。

返回0个节点。

$count = $dom->findvalue("count(//TaggedPDF-doc//Part//Sect//Sect//Sect[contains(H4,
         translate(\"Primary Objectives\", 
                   'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 
                   'abcdefghjiklmnopqrstuvwxyz')
         )
]//OBJ)");

希望有人在这里可以指出我错在哪里。

提前致谢, 西马克

4 个答案:

答案 0 :(得分:4)

首先,您可能不需要所有这些//步骤,因为//允许在任一侧命名的节点之间的任意数量级别的元素 - 枚举来自root使用单个/步骤,或者只使用一个//来搜索整个树。

其次,您需要对要比较的Header值进行保留,而不是您要比较的固定字符串。尝试更像

的东西
count(//Sect[
          Header[
            contains(
              translate(
                .,
                'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                'abcdefghijklmnopqrstuvwxyz'),
              'primary objectives'
            )
          ]
        ]//Obj)

这将为您提供Obj元素的计数,这些元素出现在Sect内,其中任何Header子项包含“主要目标”(不区分大小写)。这与

略有不同
count(//Sect[contains(translate(Header, ....

Sect包含多个Header的情况下 - 后者只检查每个Header中的第一个 Sect而不是寻找任何一场比赛。

答案 1 :(得分:2)

如果您可以访问Xath中包含的XPath 2.0(或更高版本)实现,则可以使用

count(
  //TaggedPDF-doc//Part//Sect//Sect//Sect[
    contains(lower-case(H4), 'exclusion criteria')
  ]//OBJ
)

eXist DBBaseXSaxonlots of others存在XPath 2.0处理器的Perl接口(实际上是支持XQuery的XML数据库)。

答案 2 :(得分:1)

您需要折叠两个字符串:

contains(translate(Header, '...', '...'), 'primary objectives')

请注意,您可以使用

# Letters of "primary objectives"
'ABCEIJMOPRSTVY', 'abceijmoprstvy'

而不是更大但仍然有限的集合

 # Some of the latin letters
'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'

答案 3 :(得分:0)

您要做的是检查H4的内容是否包含“Exclusion criters”转换为小写。

  

count =   $ dom-&GT; findvalue(“计数(// TaggedPDF-doc的// //部分派// //派宗[含有(H4,              翻译(\“排除标准\”,                        'ABCDEFGHJIKLMNOPQRSTUVWXYZ',                        'abcdefghjiklmnopqrstuvwxyz')              )

     

] // OBJ)“);

这与做:

相同
count = $dom->findvalue("count(//TaggedPDF-doc//Part//Sect//Sect//Sect[contains(
        H4, \"exclusion criteria\"
     )
]//OBJ)");

您想要的是将H4的内容翻译为小写,并将其与您搜索的小写版本进行比较;在这种情况下\"exclusion criteria\"

count = $dom->findvalue("count(//TaggedPDF-doc//Part//Sect//Sect//Sect[contains(
     translate(H4, 
         'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 
         'abcdefghjiklmnopqrstuvwxyz'), 
     \"exclusion criteria\"
     )
]//OBJ)");