XPath与属性值上的正则表达式匹配

时间:2011-05-08 04:21:07

标签: regex xpath attributes

全部 -

为了破解这个问题,我已经搜索并修整了几个小时,但我仍然遇到问题。我有以下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>

我正在尝试在description属性的值中获取包含文本'double'的事件节点的总数。这是我到目前为止所尝试的,无济于事(irb抛出错误):

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

因为我只是想匹配description属性值的一个片段,所以可以使用XPath 2.0函数'matches',对吗?如果是这样,我做错了什么?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:34)

  

我正在努力获得总数   包含文本的事件节点   双倍的价值   description属性。

matches()是标准的XPath 2.0功能。它在XPath 1.0中不可用

您可以使用

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

要验证这个,这是一个小的XSLT转换,它只输出在提供的XML文档上评估上述XPath表达式的结果:

<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

答案 1 :(得分:9)

尝试以下变体:

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

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

/game/team/event[contains(@description, ' doubles ')]/@description

答案 2 :(得分:1)

  

因为我只是想匹配一个   片段的价值   描述属性,这是可能的   使用XPath 2.0功能   '匹配',对吧?

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

如果您使用XPath 2.0引擎执行该XPath,它将选择适当的@description属性。

  

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

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

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

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