XSLT&Xpath構文の入荷状況によってはを参照して要素の外側の対象範囲

StackOverflow https://stackoverflow.com/questions/1843693

  •  12-09-2019
  •  | 
  •  

質問

私は、以下の作業は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>
役に立ちましたか?

解決

から選択し、 $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, だけを選択するノードで十分です。が存在しない場合、空のノード-セットが返されます。でも評価の値が偽の場合に、外の空のノードに設定し、常に評価します。

場合は参照ノードによる @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])&gt;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])&gt;0">descendant-selected </xsl:if>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top