4

ショートカット「//」について読んでいますが、これは明らかに次のショートカットです。

「/子孫または自己」

そのような式の単純な例から、たとえば、何を期待するかは明らかです。

//myNode

「myNode」と呼ばれる要素のルートから見つかった、ドキュメント内のすべてのインスタンスのノード リストを返します。

ただし、次のようなより複雑な式の意味は何ですか。

//aNode//myNode

?

// ('/descendant-or-self' のショートカット) はルート ノードに 2 回一致するため、これは式 '//aNode' の最初の部分が冗長であり、完了するのにかかる時間を増やすだけであることを意味しますか?式の実行 (「myNode」のドキュメント全体ですべての式しか見つからなかった後) ?

「//myNode」と「//aNode//myNode」はまったく同じ結果になるのでしょうか?

最後に、ドキュメントを検索して、ノード「interestingTree」の間接的な子孫であるノード「myNode」のインスタンスを探していたとします。しかし、ノード 'nonInterestingTree' の間接的な子孫であるノード 'myNode' のインスタンスは必要ありません。

たとえば、次のドキュメントを検索します。

<root>
    <anode>
        <interestingTree>
            <unknownTree>
                <myNode/><!-- I want to find this one, not the other, where I don't know the path indicated by 'unknownTree' -->
            </unknownTree>
        </interestingTree>
        <nonInterestingTree>
            <unknownTree>
                <myNode/>
            </unknownTree>
        </nonInterestingTree>
    </anode>
    <anode>
        <someOtherNode/>
    </anode>
</root>

ありがとう!

4

2 に答える 2

4

「//myNode」と「//aNode//myNode」はまったく同じ結果になるのでしょうか?

はい、この場合、すべてmyNodesが の子孫でもあるためですanode。ただし、一般的な意味では、祖先ツリーに親//aNode//myNodeを持たないノードとは明らかに一致しません。anode

xpath:

//aNode//myNode

aNodeとの間の中間階層を無視します。つまり、 、、およびmyNodeに一致します。/aNode/myNode/anyNodes/anode/myNode/anyNodes/anode/xyzNode/myNode

最後の質問に答えます。次のように、興味深いサブパス内のノードを見つけることができます (また、階層内の中間要素を無視します)。

//anode//interestingTree//myNode

もちろん理想的には、//検索する必要がある要素が多数になる可能性があるため、パフォーマンスのオーバーヘッドが発生する可能性があるため、パスをできるだけ明示する必要があります。

編集おそらくこれは役に立ちますか?

わかりやすくするために、xml 入力を次のように調整しました。

<root>
    <anode>
        <interestingTree>
            <unknownTree>
                <myNode>
                    MyNode In Interesting Tree
                </myNode>
            </unknownTree>
        </interestingTree>
        <nonInterestingTree>
            <unknownTree>
                <myNode>
                    MyNode In Non-Interesting Tree
                </myNode>
            </unknownTree>
        </nonInterestingTree>
    </anode>
    <anode>
        <someOtherNode/>
    </anode>
    <bnode>
        <myNode>
            MyNode in BNode
        </myNode>
    </bnode>
</root>

スタイルシートを介して解析すると:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        Matched by `//myNode`
        <xsl:apply-templates select="//myNode">
        </xsl:apply-templates>

        Matched by `//aNode//myNode`
        <xsl:apply-templates select="//anode//myNode">
        </xsl:apply-templates>

        Matched by `//aNode//interestingTree//myNode`
        <xsl:apply-templates select="//anode//interestingTree//myNode">
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="myNode">
        <xsl:value-of select="text()"/>
    </xsl:template>
</xsl:stylesheet>

以下を返します。

Matched by `//myNode`
        MyNode In Interesting Tree
        MyNode In Non-Interesting Tree
    MyNode in BNode

Matched by `//aNode//myNode`
        MyNode In Interesting Tree
        MyNode In Non-Interesting Tree

Matched by `//aNode//interestingTree//myNode`
        MyNode In Interesting Tree
于 2012-09-21T12:34:09.143 に答える
1

「'//myNode' と '//aNode//myNode' はまったく同じ結果になるのでしょうか?」と尋ねます。

必ずしも。myNode1 つ目は、ドキュメントで指定されたすべての要素を返します。myNode2 番目は、 という名前の要素の子孫として出現する、名前の付いたすべての要素を返しますaNode。あなたの例の XML では、これら 2 つの記述はたまたま同じセットを定義していますが、一部の XML ドキュメントではそうではありません。

一方、式//aNode//myNodeand//myNode[ancestor::aNode]は、常に同じノードのセットを返します。

于 2012-09-21T17:08:22.173 に答える