使用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
返回匹配“猫”整只字的结果:
<cat name="Cat" color="grey"/>
如何调整比赛的查询,使其整个单词相匹配?
编辑:我忘了提,我需要仍然使用匹配功能,因为我需要的不区分大小写的标志。
怎么样使用^
和$
字符作为锚?
//cat[descendant-or-self::*[@*[matches(.,'^Cat$')]]]
从正则表达式语法。1.0和XPath 2.0 :
两元字符,^和$添加。 默认情况下,元字符^匹配整个字符串的开头,而$整个字符串的结尾相匹配。
有三个功能/这里相关的运营商。
匹配()做了正则表达式匹配; 你可以用它来搭配一个子或通过使用锚(^ $猫)的整个字符串匹配,并且可以设置“i”标志,使它的情况下盲。
含有()做了子串的精确匹配; 可以使用第三个参数(对照)来请求的情况下,盲匹配,但在其中指定归类的方法取决于所使用的处理器上。
eq操作符做整个字符串的精确匹配; “默认排序规则”(这在XPath中的情况下,将通常使用处理器的API来设置)可被用于请求的情况下,盲匹配。 这似乎是一个最接近你的要求,唯一的缺点就是指定排序规则是更依赖于系统比使用“我”标志用火柴()。
但我想用火柴返回匹配“猫”整只字的结果:
<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"/>
这个:
//cat[@*='Cat']
结果是:
<cat name="Cat" color="grey"/>
我验证使用Xacobeo 。
文章来源: XPath: Match whole word (using matches function with case insensitive flag)