0

私は次のxmlを持っています:

<root>
    <a>value1</a>
    <b>value2</b>
    <c>value3</c>
    <a>value5</a>
    <d>value4</d>
    <b>value2</b>
    <b>value3</b>
    <a>value7</a>
</root>

a他の b ノードが続いていない場合、ノードの後に​​最初の兄弟を選択したい//b[text()='value2'](この場合は、選択されるべき<a>value5</a><a>value7</a>はない)。

それを行うためのxpathは何ですか?

私は.net 4とxpath 1.0を使用しています

アップデート

これが私がこれを持っているところです: 私が解析しているドキュメントは非常にばかげた構造を持っています.

<root>
    <key>key-value</key>
    <some-other-nodes>some other values</some-other-nodes>
    <key>an other key value</key>
    <value>the value</value>
</root>

私が説明したドキュメントには、次のキーと値のペアが含まれています: キー値->{null} 他のキー値->{値}

キー ノードが繰り返されると、値がリセットされkeyます。特定のキーの値を選択するには、xpath が必要です。上記の例では、 の 2 番目の一致の後に//b[text()='value2']が続く<b>value3</b>ため、キーは にリセットされます。value3

4

2 に答える 2

3

使用:

   //b[text()='value2']
          /following-sibling::b[last()]
                 /following-sibling::a[1]
  |
   //b[text()='value2']
        [not(following-sibling::b)]
             /following-sibling::a[1]

これにより、次のいずれかが選択されます。

  1. 最初の要素aの次の兄弟の最後の兄弟の最初の次の兄弟、または:bb

  2. 最初のb要素の最初の後続の兄弟 (後続の兄弟が他にない場合)b

これは、次のようにさらに単純化できます

  //b[text()='value2']/../b[last()]/following-sibling::a[1]

更新

//b[text()='value2']提供された XML ドキュメントから 2 つの要素を選択するとき、OP は、XPath 式の最初の場所のステップで、これら 2 つの要素のどちらを選択するかを指定する必要があります

より正確な XPath 式を次に示します。ここで$kは選択された要素のこの場合の数値 (1 または 2) ですb[. = 'value2']

  (//b[text()='value2'])[$k]/../b[last()]/following-sibling::a[1]

XSLT ベースの検証:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="k" select="1"/>

 <xsl:template match="/">
  <xsl:copy-of select=
  "(//b[text()='value2'])[$k]
      /../b[last()]
         /following-sibling::a[1]"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<root>
    <a>value1</a>
    <b>value2</b>
    <c>value3</c>
    <a>value5</a>
    <d>value4</d>
    <b>value2</b>
    <b>value3</b>
    <a>value7</a>
</root>

XPath 式が評価され、この評価によって選択された要素が出力にコピーされます

<a>value7</a>
于 2012-09-08T21:12:17.527 に答える
2

これがうまくいくはずです:

//b[.='value2']/following-sibling::a[preceding-sibling::b[1][.='value2']]

簡単に言えば、 value を持つa任意の要素に続く要素を選択します。ここで、最新の要素は value を持ちます。b'value2'b'value2'

編集:今考えてみると、最初の部分が必要かどうかさえわかりません。これを試して:

//a[preceding-sibling::b[1][.='value2']]
于 2012-09-08T23:19:51.257 に答える