XPath与正则expression式匹配的属性值

所有 –

我已经search了几个小时,试图破解这个,但是我仍然有问题。 我有下面的XML数据:

<game id="2009/05/02/arimlb-milmlb-1" pk="244539"> <team id="109" name="Arizona" home_team="false"> <event number="9" inning="1" description="Felipe Lopez doubles to left fielder Chris Duffy. "/> <event number="15" inning="1" description="Augie Ojeda flies out to center fielder Mike Cameron. "/> <event number="23" inning="1" description="Chad Tracy doubles to right fielder Joe Sanchez. "/> <event number="52" inning="2" description="Mark Reynolds lines out to left fielder Chris Duffy. "/> <!-- more data here --> </team> </game> 

我正在试图获取描述属性的值中包含文本“双打”的事件节点的总数。 这是我一直在努力,无济于事(IRB抛出一个错误):

 "/game/team/event/@description[matches(.,' doubles ')]" 

由于我只是想匹配描述属性值的一个片段,所以可以使用XPath 2.0函数“matches”,对吗? 如果是这样,我做错了什么?

提前感谢任何帮助!

我正在试图获取描述属性的值中包含文本“双打”的事件节点的总数。

matches()是一个标准的XPath 2.0函数。 它在XPath 1.0中不可用

你可以使用

 count(/*/*/event[contains(@description, ' doubles ')]) 

为了validation这一点 ,下面是一个小的XSLT转换,它只是输出在提供的XML文档上评估上述XPathexpression式的结果:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:value-of select= "count(/*/*/event[contains(@description, ' doubles ')])"/> </xsl:template> </xsl:stylesheet> 

当这个转换应用于提供的XML文档时:

 <game id="2009/05/02/arimlb-milmlb-1" pk="244539"> <team id="109" name="Arizona" home_team="false"> <event number="9" inning="1" description="Felipe Lopez doubles to left fielder Chris Duffy. "/> <event number="15" inning="1" description="Augie Ojeda flies out to center fielder Mike Cameron. "/> <event number="23" inning="1" description="Chad Tracy doubles to right fielder Joe Sanchez. "/> <event number="52" inning="2" description="Mark Reynolds lines out to left fielder Chris Duffy. "/> <!-- more data here --> </team> </game> 

想要的,正确的结果是

 2 

尝试以下变体:

 /game/team/event[matches(@description, ' doubles ')]/@description /game/team/event[matches(@description, '^.*?doubles.*$')]/@description /game/team/event[contains(@description, ' doubles ')]/@description 

由于我只是想匹配描述属性值的一个片段,所以可以使用XPath 2.0函数“matches”,对吗?

是的,只要您使用XPath 2.0引擎来评估XPathexpression式。

如果您要使用XPath 2.0引擎来执行该XPath,则会select相应的@description属性。

如果是这样,我做错了什么?

如果您使用的是XPath 2.0引擎,那么您的问题可能是您select了一系列节点,但期待计数。

如果你想返回这些属性的数量,你可以使用count()函数:

 count(/game/team/event/@description[matches(.,' doubles ')])