XSLT 获取最后一个元素

182
我正在尝试找到我的xml中的最后一个元素,它的样子是:
<list>
  <element name="A" />
  <element name="B" >
    <element name="C" />
    <element name="D" >
      <element name="D" />
      <element name="E" />
      <element name="F" />
      <element name="G" />
    </element>
    <element name="H" />
    <element name="I" />
  </element>
</list>

我需要一个反向菜单,其中当前元素和父元素被标记为“活动”,而兄弟元素被标记为“非活动”。但结果却是一个混乱的树,只有当我点击“D”元素时才会出现。
双重D元素是我的问题所在。当我使用select="//element[@name='D'][last()]"select="//element[@name='D' and last()]"(顺便问一下,哪个是正确的?)第一次选择的是D元素的第一个出现(调试器显示如此)。以下是XSL代码。
<xsl:template match="list">
    <xsl:apply-templates select="//navelement[@name = 'D'][last()]" mode="active"/>
</xsl:template>

<xsl:template match="element">
    <ul class="menu">
    <xsl:apply-templates select="preceding-sibling::node()" mode="inactive"/>
        <li><a>....</a></li>
    <xsl:apply-templates select="following-sibling::node()" mode="inactive"/>
    </ul>   
    <xsl:apply-templates select="parent::element" mode="active"/>
</xsl:template>

<xsl:template match="element" mode="inactive">
        <li><a>....</a></li>
</xsl:template>
1个回答

384

你需要将last()索引放在节点列表结果上,而不是作为选择条件的一部分。尝试使用:

你需要将last()索引放在节点列表结果上,而不是作为选择条件的一部分。尝试使用:

(//element[@name='D'])[last()]

9
TIL:显然没有[first()],但你可以使用[1]。 - Jessica
14
7年后我仍然收到人们对这个问题的投票,真的很有趣。这实际上展示了XSLT的缺陷和不足之处。避免使用XSLT,它就像瘟疫一样:D。 - Nik
对我来说运行得非常好,谢谢! - eugene.polschikov
4
@Nik. 这反而表明很少有人理解这种语言的力量。 - Siebe Jongebloed
5
@Nik:我是一个真实世界的例子。我很喜欢它 :)。因为我喜欢XSLT,如果你需要处理XML,没有比它更好的语言了。 - Siebe Jongebloed
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接