XPath的:全字匹配(使用匹配与不区分大小写标记功能)(XPath: Match whole wo

2019-07-29 05:47发布

使用XPath,我想(用户选择,就像在VS搜索),以“全字匹配”。

它好像功能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"/>

如何调整比赛的查询,使其整个单词相匹配?

编辑:我忘了提,我需要仍然使用匹配功能,因为我需要的不区分大小写的标志。

Answer 1:

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

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

从正则表达式语法。1.0和XPath 2.0 :

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



Answer 2:

这会为你工作?

//cat[@*='Cat']


Answer 3:

有三个功能/这里相关的运营商。

匹配()做了正则表达式匹配; 你可以用它来搭配一个子或通过使用锚(^ $猫)的整个字符串匹配,并且可以设置“i”标志,使它的情况下盲。

含有()做了子串的精确匹配; 可以使用第三个参数(对照)来请求的情况下,盲匹配,但在其中指定归类的方法取决于所使用的处理器上。

eq操作符做整个字符串的精确匹配; “默认排序规则”(这在XPath中的情况下,将通常使用处理器的API来设置)可被用于请求的情况下,盲匹配。 这似乎是一个最接近你的要求,唯一的缺点就是指定排序规则是更依赖于系统比使用“我”标志用火柴()。



Answer 4:

但我想用火柴返回匹配“猫”整只字的结果:

 <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"/>


Answer 5:

这个:

//cat[@*='Cat']

结果是:

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

我验证使用Xacobeo 。



文章来源: XPath: Match whole word (using matches function with case insensitive flag)