大小写不敏感搜索 - xpath

3
我试图使用以下XPath表达式在我的XML文档中进行不区分大小写的搜索。显然,我的做法有误,因为结果不同。希望这里有人能指出我的错误。
我尝试获取所有<Sect>下Obj元素的计数,其中<Header>值为Primary Objectives。为了得到计数,我使用以下表达式,它运行良好。
表达式-不区分大小写:返回31个节点。
("count(//TaggedPDF-doc//Part//Sect//Sect//Sect[contains(Header,\"Primary objectives\")]//OBJ)");

但我希望使“主要目标”不区分大小写。因此,我尝试使用翻译来实现这一点。 表达式-添加翻译以使“主要目标”不区分大小写。

返回0个节点。

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

希望有人能指出我的错误所在。
提前致谢, Simak
4个回答

4
首先,您可能不需要所有这些//步骤,因为//允许在两侧命名的节点之间具有任意数量的元素级别 - 要么使用单个/步骤枚举从根开始的完整路径,要么只使用一个//搜索整个树。
其次,您需要将比较的Header值转换为小写字母,而不是与之进行比较的固定字符串。尝试使用类似以下内容的东西
count(//Sect[
          Header[
            contains(
              translate(
                .,
                'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                'abcdefghijklmnopqrstuvwxyz'),
              'primary objectives'
            )
          ]
        ]//Obj)

这段话的意思是:“它将提供您在任何包含“主要目标”(不区分大小写)的Header子元素的Sect中发生的Obj元素的计数。这与…略有不同。”
count(//Sect[contains(translate(Header, ....

Sect包含多个Header的情况下,Header只会检查每个Sect中的第一个Header,而不是在其中任何一个寻找匹配项。

2
如果你有一个XPath 2.0(或更高版本)的实现——包含在XQuery中——你可以使用它。
count(
  //TaggedPDF-doc//Part//Sect//Sect//Sect[
    contains(lower-case(H4), 'exclusion criteria')
  ]//OBJ
)

XPath 2.0处理器的Perl接口(实际上是支持XQuery的XML数据库)存在于eXist DB, BaseX, Saxon许多其他中。

一般来说,为了进行不区分大小写的匹配,您需要将字符转换为折叠大小写(而不是小写)。但由于所有字符都是ASCII字母,这种方法也可以奏效,而且比转换的替代方案更容易输入。 - ikegami

1

您需要折叠这两个字符串:

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

请注意,您可以使用以下代码:


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

代替更大但仍有限的集合。
 # Some of the latin letters
'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'

0

你正在尝试检查H4的内容是否包含转换为小写的“排除标准”。

计数 = $dom->findvalue("count(//TaggedPDF-doc//Part//Sect//Sect//Sect[contains(H4, translate(\"排除标准\", 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') )

]//OBJ)");

这与以下操作相同:

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

你需要做的是将H4标签中的内容转换为小写,并将其与你搜索的小写版本进行比较;在这种情况下,即"排除标准"
count = $dom->findvalue("count(//TaggedPDF-doc//Part//Sect//Sect//Sect[contains(
     translate(H4, 
         'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 
         'abcdefghjiklmnopqrstuvwxyz'), 
     \"exclusion criteria\"
     )
]//OBJ)");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接