1

私は以下を100%正しく動作させています。しかし、私の好奇心を満たすために... currentID 変数を宣言せずに同じことを達成する方法はありますか? Xpath「テスト」条件内から参照する方法はありますか?

条件内の xpath クエリは、2 つの @id 属性を参照して、それらが一致するかどうかを確認する必要があります。

  • 「現在の」@id
  • 各「祖先」@id

コードは次のとおりです。

<xsl:variable name="currentID" select="@id" />
<xsl:attribute name="class">
<xsl:if test="count($currentPage/ancestor::node [@id = $currentID])&gt;0">descendant-selected </xsl:if>
</xsl:attribute>
4

5 に答える 5

3

$currentIDコンテキスト ノードからを選択したため、次のようになります。

<xsl:variable name="currentID" select="@id" />

current()常に XSLT コンテキスト ノードを参照する関数を使用できます。

<xsl:attribute name="class">
  <xsl:if test="count($currentPage/ancestor::node[@id = current()/@id]) &gt; 0]">
    <xsl:text>descendant-selected </xsl:text>
  </xsl:if>
</xsl:attribute>

この方法では、変数は必要ありません。

その他の注意事項:

  • <xsl:text>上記のように使用することをお勧めします。これにより、コードをより自由にフォーマットし、過度に長い行を避けることができます。
  • を実行する必要はありませんcount() > 0。単にノードを選択するだけで十分です。存在しない場合は、空のノード セットが返されます。これは常に false と評価されますが、空でないノードセットは常に true と評価されます。

@idXSL スタイルシートで定期的にノードを参照する場合は、次のようにすると便利です<xsl:key>

<xsl:key name="kNodeById" match="node" use="@id" />

<!-- ... -->

<xsl:attribute name="class">
  <xsl:if test="key('kNodeById', @id)">
    <xsl:text>descendant-selected </xsl:text>
  </xsl:if>
</xsl:attribute>

current()XPath述語の外側では、コンテキストは変更されないため、上記は必要ありません。count()また、これは冗長であるため(説明どおり)、ノードは使用しません。

于 2009-12-04T10:07:20.060 に答える
2

テンプレートによって処理された現在のノードを参照するには、 current() を使用します。

<xsl:if test="count($currentPage/ancestor::node [@id = current()/@id])&gt;0">
于 2009-12-04T08:15:53.937 に答える
1

すでに明らかになっているように、「=」演算子を使用して直接比較できるため、「外部スコープ」を参照することは問題ではありませんでした。ただし、current()が必要な場合や、current()でさえもカットされない場合があります(2つ以上のコンテキスト間で「結合」する必要があるため)。そのような場合、XPath2.0の「for」式は不可欠です。

于 2009-12-07T22:13:08.143 に答える
1

ティムは私に考えさせました....私は物事を複雑にしすぎていたと思います。私は次のことを試しました。

<xsl:if test="@id = $currentPage/ancestor::node/@id">descendant-selected </xsl:if>

XSLT は、属性を選択した属性と比較し、それらのいずれかが一致した場合に true と評価することに満足しているように見えますか? なぜこれが機能するのか、またはより良い(より簡潔な)理由について誰かがより良い説明を持っている場合は、それを書き留めてください。

于 2009-12-04T00:43:02.630 に答える
0

あなたは単に行うことができます:

<xsl:if test="count($currentPage[ancestor::node/@id = @id])&gt;0">descendant-selected </xsl:if>
于 2009-12-03T23:34:04.903 に答える