XSLT&Xpath構文の入荷状況によってはを参照して要素の外側の対象範囲
質問
私は、以下の作業は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])>0">descendant-selected </xsl:if>
</xsl:attribute>
解決
から選択し、 $currentID
からのコンテキストノード:
<xsl:variable name="currentID" select="@id" />
で利用できます current()
機能は、常に参照するようにするにXSLTコンテキストノード:
<xsl:attribute name="class">
<xsl:if test="count($currentPage/ancestor::node[@id = current()/@id) > 0]">
<xsl:text>descendant-selected </xsl:text>
</xsl:if>
</xsl:attribute>
このような可変となります。
数その他特記事項:
- 私の使用をお勧めし
<xsl:text>
のように上記に示します。こさと自由なフォーマットコードを回避する過度に長い。 - する必要がない
count() > 0
, だけを選択するノードで十分です。が存在しない場合、空のノード-セットが返されます。でも評価の値が偽の場合に、外の空のノードに設定し、常に評価します。
場合は参照ノードによる @id
定期的にXSLスタイルシート、 <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()
以外に次のように述語のコンテキストは不変です。することも少ないかも count()
のノードは、冗長化(説明).
他のヒント
テンプレートによって処理現在のノードを参照するために)(現在使用
<xsl:if test="count($currentPage/ancestor::node [@id = current()/@id])>0">
ティムは私が考えるようになった.... 私は物事を複雑に超えていたと思うし、私は作品次のことを試してみました。
<xsl:if test="@id = $currentPage/ancestor::node/@id">descendant-selected </xsl:if>
XSLTは、属性を選択して属性を比較し、それらのいずれかが一致する場合はtrueを評価する幸せなようですか?誰もがこの作品以上のもの(より簡潔)理由のより良い説明を持っているならば、それを置くます。
これはすでに「外側のスコープ」を参照して、明らかになったとして、あなたは、「=」演算子を使用して直接比較を行う可能性があるため、問題ではありませんでした。しかし、あなたはどこでも、現在のほかに(現在)と、より必要ないいくつかの例は、(あなたがちょうど2つのコンテキストよりも多くの間で「参加」する必要があるため)()それをカットしていませんがあります。これらのケースでは、XPath 2.0のの表現が不可欠である「ため、」ます。
あなたは、単に行うことができます:
<xsl:if test="count($currentPage[ancestor::node/@id = @id])>0">descendant-selected </xsl:if>