3

XPath の標準を読んで、その一部がどのように機能するかを理解しようとしています。

http://www.w3.org/TR/xpath/

xpath 標準では、descendants-or-self が評価される順序が指定されていないようです (コンテキスト ノードが最初、または子孫が最初)。RFC のある段階で、存在する場合はすべての子孫とコンテキストを返すと述べています。別の段階では、コンテキスト ノードとすべての子孫を返すという反対のことを言います。

私の質問は: この XPath の動作は何ですか:

/a//c

論理的な観点から、これは深さ優先検索を行うことになっています。したがって、次の XML の場合:

<a>
  <b>
    <c v="1"/>
  </b>
  <c v="2"/>
</a>

ここでの論理的な(そして実際のものと思われる)動作は、結果が次のようになるようです。

c (v="1")
c (v="2")

ただし、RFC によると、 //c は以下と同等です。

/descendant-or-self::node()/child::c

つまり、私がこれを正しく理解している場合、子孫または自己がどのように評価されるかによって動作が異なる可能性があることを意味します。

コンテキスト ノードが最初に返された場合、結果は次のようになります。

c(v="2")
c(v="1")

に適用されたときに最初のノードが「//」から返されたので、それaは自己です(これはですa)。次に、それがその最初の子であるため、返さchild::cれると思います...c(v="2")ac

c(v="1")実際に最初に返す必要がある理由を説明するRFC部分を誰かが指摘できますか?

4

2 に答える 2

4

XPath 1.0 仕様から:

軸は、前進軸または後退軸のいずれかです。ドキュメント順でコンテキスト ノードの後に​​あるコンテキスト ノードのみを含む軸は、前方軸です。ドキュメント順でコンテキスト ノードの前にあるコンテキスト ノードのみを含む軸は、逆軸です。したがって、祖先、祖先または自己、先行、および先行兄弟の軸は逆の軸です。他のすべての軸は前進軸です。セルフ軸には常に最大 1 つのノードが含まれるため、順方向軸でも逆方向軸でも違いはありません。軸に対するノードセットのメンバーの近接位置は、軸が順方向の軸である場合はドキュメント順で並べられ、軸が逆方向の場合はドキュメント順で並べられたノードセット内のノードの位置であると定義されます。逆軸です。最初の位置は 1 です。

ここでわかるように、descendant-or-selfは順方向の軸であるため、その軸に対する位置はドキュメントの順序になっています。

ただし、これはあなたの質問の核心への議論の余地があるポイントだと思います。ノードセットの内容はxsl:apply-templatesxsl:for-each、 など (下記参照) を使用する場合、常にドキュメント順で処理されるため、 の内容は/a//cドキュメント順になります。

オンapply-templates(XSLT 1.0 仕様から)

選択されたノードのセットは、ソート仕様が存在しない限り、ドキュメント順に処理されます ([10 ソート] を参照)。

オンfor-each(XSLT 1.0 仕様から)

ノードは、ソート仕様が存在しない限り、ドキュメント順に処理されます ([10 ソート] を参照)。

(XPath 1.0仕様)からの軸の扱いの詳細:

注: Predicate の意味は、どの軸が適用されるかによって大きく異なります。たとえば、preceding::foo[1] は最初の foo 要素をドキュメントの逆順で返します。これは、[1] 述語に適用される軸が先行軸であるためです。対照的に、 (preceding::foo)[1] は、[1] 述語に適用される軸が子軸であるため、ドキュメント順で最初の foo 要素を返します。

于 2013-03-04T08:02:12.233 に答える
2

XPath 1.0 仕様に関する限り、XPath 式の結果はシーケンスではなくノード セットです。つまり、ノードの順序は定義されていません。ただし、XSLT は常にドキュメントの順序で結果を処理するため、他のほとんどの XPath API もドキュメントの順序で結果を提供しますが、これは正式な要件ではありません。

完全に別の主語は、述語内の「position()」の意味です。大まかに、position() は、コンテキスト ノードからノードまでの距離を参照します。これは、式の結果が返される順序とは関係ありません。

于 2013-03-04T12:10:21.690 に答える