我有以下正确的100%工作。 然而,为了满足我的好奇心......有没有办法在不声明currentID变量的情况下实现相同的目标? 有没有办法从Xpath“测试”条件中引用它?
条件中的xpath查询必须引用2个@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>
答案 0 :(得分:3)
因为您从上下文节点中选择$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。如果您在XSL样式表中定期引用@id
节点,则<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()
节点,因为这是多余的(如上所述)。
答案 1 :(得分:2)
使用current()来引用模板处理的当前节点:
<xsl:if test="count($currentPage/ancestor::node [@id = current()/@id])>0">
答案 2 :(得分:1)
<xsl:if test="@id = $currentPage/ancestor::node/@id">descendant-selected </xsl:if>
XSLT似乎很乐意将属性与选择的属性进行比较,如果任何属性匹配,则评估为true?如果有人能更好地解释为什么会这样或更好(更简洁),那么就把它放下来。
答案 3 :(得分:1)
已经很清楚,提到“外部范围”不是问题,因为您可以使用“=”运算符进行直接比较。但是,在某些情况下你确实需要current()和更多,除了current()不会削减它(因为你需要在两个以上的上下文之间“连接”)。在这些情况下,XPath 2.0的“for”表达式是不可或缺的。
答案 4 :(得分:0)
你可以这样做:
<xsl:if test="count($currentPage[ancestor::node/@id = @id])>0">descendant-selected </xsl:if>