Поскольку вы выбираете $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
, достаточно просто выбрать узлы. Если ничего не существует, возвращается пустой набор узлов. Он всегда оценивается как false, а непустые наборы узлов всегда оцениваются как true.
Если вы регулярно ссылаетесь на узлы @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()
, поскольку вне предиката XPath контекст не изменяется. Кроме того, я не count()
узлов, так как это избыточно (как объяснено).