使用XPath,我想"匹配整个单词" (用户选项,就像在VS搜索中一样)。
似乎函数contains
和matches
的工作方式类似,但匹配允许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
返回符合&#34; Cat&#34;的结果。全文只有:
<cat name="Cat" color="grey"/>
如何调整匹配查询以使其与整个单词匹配?
修改: 我忘了提到我还需要使用匹配函数,因为我需要不区分大小写的标记。
答案 0 :(得分:5)
如果使用^
和$
字符作为锚点呢?
//cat[descendant-or-self::*[@*[matches(.,'^Cat$')]]]
来自RegEx Syntax in XQuery 1.0 and XPath 2.0:
添加了两个元字符 ^ 和 $ 。默认情况下,元字符 ^ 匹配整个字符串的开头,而 $ 匹配整个字符串的结尾 整个字符串。
答案 1 :(得分:2)
这对你有用吗?
//cat[@*='Cat']
答案 2 :(得分:2)
这里有三个相关的函数/运算符。
matches()执行正则表达式匹配;您可以使用它来匹配子字符串或使用锚点(^ cat $)匹配整个字符串,并且您可以设置'i'标志以使其成为盲区。
contains()与子字符串完全匹配;您可以使用第三个参数(排序规则)来请求大小写盲,但指定排序规则的方式取决于您使用的处理器。
eq运算符与整个字符串完全匹配; “默认排序规则”(在XPath的情况下通常使用处理器的API设置)可用于请求大小写盲匹配。这似乎是最符合您要求的那个,唯一的缺点是指定排序规则比使用匹配()的“i”标志更依赖于系统。
答案 3 :(得分: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"/>
答案 4 :(得分:1)