1

これが私が使用しているxmlであり、最初に遭遇した異なるpd値のID番号を試しています。

<result>
  <pd>a</pd>
  <id>1</id>
  <pd>a</pd>
  <id>2</id>

  <pd>b</pd>
  <id>8</id>

  <pd>c</pd>
  <id>9</id>
  <pd>c</pd>
  <id>4</id>

  <pd>d</pd>
  <id>7</id>
</result>

したがって、私が期待している結果は次のとおりです。

 <pd>a</pd>
 <id>1</id>

 <pd>b</pd>
 <id>8</id>

 <pd>c</pd>
 <id>9</id>

 <pd>d</pd>
 <id>7</id>

次のpdを取得して現在のノードと比較するためにfollowing-sibling::* [2]を使用しましたが、cとdではなくbのみが表示されました。xml全体を反復処理して目的の出力を取得する方法についてのヒントを教えてもらえますか?ありがとう!!

4

2 に答える 2

1

より洗練された解決策があるかもしれませんが、私が取った戦略は、pd要素のすべての個別の値を収集し、次にすべてのpd要素をループして、pd要素の値が個別の値の現在の反復。

for $distinct-pd in fn:distinct-values($xml//pd)
  for $pd in $xml//pd[./text() eq $distinct-pd][1]
    return ($pd, $pd/following-sibling::*[1])

あなたのコードの場合、これは

<pd>a</pd>
<id>1</id>
<pd>b</pd>
<id>8</id>
<pd>c</pd>
<id>9</id>
<pd>d</pd>
<id>7</id>
于 2012-11-24T05:53:59.277 に答える
1

同じことを達成する別の方法-それほど長くないシーケンスには十分です:

/*/pd[not(. = preceding-sibling::pd)]
               /(.|following-sibling::id[1])

このXPath2.0式(およびXQuery)が、提供されたXMLドキュメントに対して評価される場合:

<result>
  <pd>a</pd>
  <id>1</id>
  <pd>a</pd>
  <id>2</id>

  <pd>b</pd>
  <id>8</id>

  <pd>c</pd>
  <id>9</id>
  <pd>c</pd>
  <id>4</id>

  <pd>d</pd>
  <id>7</id>
</result>

必要な正しい結果が生成されます:

<pd>a</pd>
<id>1</id>
<pd>b</pd>
<id>8</id>
<pd>c</pd>
<id>9</id>
<pd>d</pd>
<id>7</id>
于 2012-11-24T18:42:19.497 に答える