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 ')])