Regex 属性值上具有正则表达式匹配的XPath

Regex 属性值上具有正则表达式匹配的XPath,regex,xpath,attributes,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

全部-

我已经搜索和修补了几个小时,试图破解这个,但我仍然有问题。我有以下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属性值的一个片段,所以可以使用XPath2.0函数“matches”,对吗?如果是,我做错了什么


提前感谢您的帮助

尝试以下变体:

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

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

/game/team/event[contains(@description, ' doubles ')]/@description
我正在试图得到 包含文本名称的事件节点 在 描述属性

是标准的XPath 2.0函数。它在XPath 1.0中不可用

您可以使用

count(/*/*/event[contains(@description, ' doubles ')])
2
为了验证这一点,这里有一个小的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>
因为我只是想匹配一个 值的片段 描述属性,这是可能的 使用XPath 2.0函数 “火柴”,对吗

是的,只要您使用XPath 2.0引擎计算XPath表达式。

如果要使用XPath2.0引擎执行该XPath,它将选择适当的
@description
属性

如果是,我做错了什么

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

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

<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>
count(/game/team/event/@description[matches(.,' doubles ')])

好问题,+1。有关完整、简短、简单的一行XPath表达式解决方案,请参见我的答案:)Mikecito-我使用Java 1.6,但我也使用Ruby irb进行XPath之类的开发和调试。也就是说,我试图首先在irb中使用XPath扫描文件,一旦我得到了一个我想要的XPath,我就会将它转移到我的Java代码中。Dimitre-您列出的XPath最终工作得很好。我会在你的帖子下面留下一条单独的评论。我怀疑前两条在Java 1.6中尝试时不起作用,因为XPath 2.0显然不可用。第三个没有引起任何异常,但它似乎没有映射到所需的节点——返回的答案是NaN。无论如何,非常感谢。matches()函数在Java1.6中似乎不可用(我之前并不知道),它抛出一个XPathExpressionException。不过还是要谢谢你!我很感激,标准的Java1.6库不支持XPath2.0,但Saxon和PsychoPath支持.Dimitre——正如我前面提到的,您文章中的XPath非常有效。最后,我通过以下内容使其更加具体:
“count(/game/team[@home\u team='false']]/event[contains(@description,'doubles')”)”
非常感谢您的帮助!我真的很感激。显然,Java1.6不讲XPath2.0。
count(/game/team/event/@description[matches(.,' doubles ')])