XSLT&amp; <Xpath语法&gt;如何引用“外部”范围中的元素

时间:2009-12-03 23:05:19

标签: xslt xpath umbraco

我有以下正确的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>

5 个答案:

答案 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) &gt; 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])&gt;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])&gt;0">descendant-selected </xsl:if>