すべて -
私はこれをクラックするために何時間も検索していじりましたが、まだ問題があります。以下の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」を使用することは可能ですか?もしそうなら、私は何が間違っていますか?
助けてくれてありがとう!
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
次のバリエーションを試してください。
/game/team/event[matches(@description, ' doubles ')]/@description
/game/team/event[matches(@description, '^.*?doubles.*$')]/@description
/game/team/event[contains(@description, ' doubles ')]/@description
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 ')])
_