带有正则表达式的XPath在属性值上匹配

全部-

我已经搜寻并修改了几个小时,以试图破解它,但是我仍然遇到问题。 我有以下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>

我正在尝试获取描述属性值中包含文本“ doubles”的事件节点的总数。 到目前为止,这是我一直在尝试的尝试,但无济于事(irb会引发错误):

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

由于我只是想匹配description属性值的一部分,因此可以使用XPath 2.0函数“ matches”,对吗? 如果是这样,我在做什么错?

在此先感谢您的帮助!

Gabe asked 2020-08-10T14:10:10Z
3个解决方案
35 votes

我正在尝试获取的总数 包含文字“ 的价值翻倍 描述属性。

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
Dimitre Novatchev answered 2020-08-10T14:10:37Z
9 votes

尝试以下变体:

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

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

/game/team/event[contains(@description, ' doubles ')]/@description
Andrey Adamovich answered 2020-08-10T14:10:57Z
1 votes

由于我只是想匹配一个 价值的片段 描述属性,有可能 使用XPath 2.0功能 “比赛”,对不对?

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

如果要使用XPath 2.0引擎执行该XPath,它将选择适当的count()属性。

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

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

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

count(/game/team/event/@description[matches(.,' doubles ')])
Mads Hansen answered 2020-08-10T14:11:39Z
translate from https://stackoverflow.com:/questions/5925567/xpath-with-regex-match-on-an-attribute-value