0

id 属性が値のコレクションの要素 (以下のコードの $item-ids ) であるかどうかに応じて、異なる動作でドキュメントを解析しています。私の質問は、次のように、変数を割り当ててその値と比較する必要があるのはなぜですか。

<xsl:template match="word/item">
    <xsl:variable name="id" select="@abg:id"/>
    <xsl:if test="$item-ids[.=$id]">
        <xsl:message>It matches!</xsl:message>
    </xsl:if>
</xsl:template>

うまくいきませんが、私はこのようにできるはずです:

<xsl:template match="word/item">
    <xsl:if test="$item-ids[.=@abg:id]">
        <xsl:message>It matches!</xsl:message>
    </xsl:if>
</xsl:template>

これは私が忘れ続け、再学習しなければならないものです。なぜこのように機能するのか、誰か説明できますか?ありがとう。

4

3 に答える 3

2

XPath を理解するには、コンテキスト ノードの概念を理解する必要があります。@id のような式は、コンテキスト ノードの属性を選択しています。また、コンテキスト ノードは角括弧内で変更されます。

于 2013-01-10T16:08:55.520 に答える
1

この場合、変数を使用する必要はありません。ここで使用できます:

<xsl:template match="word/item">
    <xsl:if test="$item-ids[. = current()/@abg:id]">
        <xsl:message>It matches!</xsl:message>
    </xsl:if>
</xsl:template>

だけを使用できない理由$item-ids[. = @abg:id]は、 の内部では、 (この場合は)[]の直前にあるもののコンテキストにいるため、として扱われるため、これは望んでいるものではありません。[]$item-ids@abg:id$item-ids/@abg:id

current()の外側の現在のコンテキストを参照する<xsl:if>ため、current()/@abg:id必要な値を反映する必要があります。

于 2013-01-10T16:07:03.103 に答える
0

ラインだからだと思う

<xsl:if test="$item-ids[.=@abg:id]">

の値を$item-ids文字列 '@abg:id' と比較します - の値と比較する必要があるため、テストが機能するために変数に@abg:idその値を選択する必要があります。$id

それはまったく役に立ちますか?

編集:私は問題を誤解しました - 他の答えは私のものよりも優れています.

于 2013-01-10T16:02:27.983 に答える