3

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

我正在尝试计算值为主要目标<Sect>的所有 Obj 元素。<Header>为了得到计数,我使用了下面的表达式,效果很好。

表达式 - 不区分大小写:返回 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)");

希望这里有人能指出我哪里弄错了。

在此先感谢,西马克

4

4 回答 4

4

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

其次,您需要将Header要比较的值小写,而不是要比较的固定字符串。尝试更多类似的东西

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

Obj这将为您提供出现在 aSect内任何Header包含“主要目标”(不区分大小写)的任何子元素的元素的计数。这与略有不同

count(//Sect[contains(translate(Header, ....

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

于 2013-07-05T14:23:07.683 回答
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 DBBaseXSaxon许多其他的

于 2013-07-05T14:10:50.283 回答
1

您需要折叠两个字符串:

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

请注意,您可以使用

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

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

 # Some of the latin letters
'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'
于 2013-07-05T13:44:52.327 回答
0

您要做的是检查 H4 的内容是否包含转换为小写的“排除标准”。

count = $dom->findvalue("count(//TaggedPDF-doc//Part//Sect//Sect//Sect[包含(H4, translate(\"排除标准\", '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)");
于 2013-07-05T13:46:06.163 回答