web-dev-qa-db-ja.com

属性値で正規表現が一致する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>

Description属性の値にテキスト「doubles」を含むイベントノードの総数を取得しようとしています。これは私がこれまで試してきたもので、役に立たない(irbはエラーをスローする):

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

Description属性の値のフラグメントを一致させようとしているだけなので、XPath 2.0関数「matches」を使用することは可能ですか?もしそうなら、私は何が間違っていますか?

助けてくれてありがとう!

42
Gabe

Description属性の値にテキスト「doubles」を含むイベントノードの総数を取得しようとしています。

matches() は標準のXPath 2.0関数です。 XPath 1.0では使用できません。

使用できます

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

これを検証するために、ここに提供されたXML文書で上記のXPath式を評価した結果を出力する小さなXSLT変換があります:

<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
34

次のバリエーションを試してください。

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

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

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

Description属性の値のフラグメントを一致させようとしているだけなので、XPath 2.0関数「matches」を使用することは可能ですか?

はい、XPath 2.0エンジンを使用してXPath式を評価している限り。

XPath 2.0エンジンを使用してそのXPathを実行する場合、適切な_@description_属性が選択されます。

もしそうなら、私は何が間違っていますか?

XPath 2.0エンジンを使用している場合、問題はノードのシーケンスを選択しているが、カウントが必要であることです。

これらの属性のカウントを返したい場合は、count()関数を使用できます:

_count(/game/team/event/@description[matches(.,' doubles ')])
_
1
Mads Hansen