6

使用 XPath,我想“匹配整个单词”(用户选项,就像在 VS 搜索中一样)。

尽管 match 允许使用不区分大小写的标志,但似乎功能containsmatches工作方式相似。i

换句话说,我通过这两个 XPath 查询得到了相同的结果:

<pets>
    <dog name="Rupert" color="grey"/>
    <dog name="Ralph" color="brown"/>
    <cat name="Marvin the Cat" color="white"/>
    <cat name="Garfield the Cat" color="orange"/>
    <cat name="Cat" color="grey"/>
    <cat name="Fluffy" color="black"/>
</pets>

Matches XPath: //cat[descendant-or-self::*[@*[matches(.,'Cat')]]]
    returns:
    <cat name="Marvin the Cat" color="white"/>
    <cat name="Garfield the Cat" color="orange"/>
    <cat name="Cat" color="grey"/>


Contains XPath: //cat[descendant-or-self::*[@*[contains(.,'Cat')]]]
    returns:
    <cat name="Marvin the Cat" color="white"/>
    <cat name="Garfield the Cat" color="orange"/>
    <cat name="Cat" color="grey"/>

但我想matches用来返回匹配“猫”整个单词的结果:

<cat name="Cat" color="grey"/>

如何调整匹配查询以匹配整个单词?

编辑:我忘了提到我仍然需要使用 match 函数,因为我需要不区分大小写的标志。

4

5 回答 5

5

使用^$字符作为锚点怎么样?

//cat[descendant-or-self::*[@*[matches(.,'^Cat$')]]]

来自XQuery 1.0 和 XPath 2.0 中的 RegEx 语法

添加了两个元字符^$。默认情况下,元字符 ^匹配整个字符串的开头,而$匹配整个字符串的结尾。

于 2012-05-01T21:03:04.790 回答
4

这里有三个相关的函数/运算符。

matches() 进行正则表达式匹配;您可以使用它来匹配子字符串或通过使用锚 (^cat$) 来匹配整个字符串,并且您可以设置 'i' 标志以使其不区分大小写。

contains() 对子字符串进行完全匹配;您可以使用第三个参数(排序规则)来请求不区分大小写的匹配,但指定排序规则的方式取决于您使用的处理器。

eq 运算符对整个字符串进行精确匹配;“默认排序规则”(在 XPath 的情况下,通常使用处理器的 API 设置)可用于请求区分大小写的匹配。这似乎是最接近您的要求的一个,唯一的缺点是指定排序规则比使用带有 match() 的“i”标志更依赖于系统。

于 2012-05-01T22:48:42.870 回答
2

这对你有用吗?

//cat[@*='Cat']
于 2012-05-01T20:23:18.497 回答
2

但我想使用匹配来返回仅匹配“Cat”整个单词的结果:

<cat name="Cat" color="grey"/>

有不同的 XPath 表达式可以选择想要的元素

采用:

/*/cat[matches(@name, '^cat$', 'i')]

或使用:

/*/cat[lower-case(@name) eq 'cat']

基于 XSLT 的验证

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select=
   "/*/cat[matches(@name, '^cat$', 'i')]"/>
======
  <xsl:copy-of select=
   "/*/cat[lower-case(@name) eq 'cat']"/>

 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<pets>
    <dog name="Rupert" color="grey"/>
    <dog name="Ralph" color="brown"/>
    <cat name="Marvin the Cat" color="white"/>
    <cat name="Garfield the Cat" color="orange"/>
    <cat name="Cat" color="grey"/>
    <cat name="Fluffy" color="black"/>
</pets>

此转换计算两个 XPath 表达式并将所选元素复制到输出

  <cat name="Cat" color="grey"/>
======
  <cat name="Cat" color="grey"/>
于 2012-05-02T01:47:26.397 回答
1

这:

//cat[@*='Cat']

结果是:

<cat name="Cat" color="grey"/>

我使用Xacobeo进行了验证。

于 2012-05-01T20:24:10.007 回答