XSLT获取最后一个元素

Nik*_*Nik 126 xslt xpath menu

我试图找到我的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" />
    </list>
Run Code Online (Sandbox Code Playgroud)

我需要获得某种反向菜单,其中当前元素和父元素被突出显示为"活动",而兄弟节点则显示为"非活动".相反,结果我只有当我想点击"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>
Run Code Online (Sandbox Code Playgroud)

Rob*_*tie 272

您需要将last()索引放在nodelist结果上,而不是作为选择条件的一部分.尝试

(//element[@name='D'])[last()]
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,7年后我仍然可以获得这个问题的投票.它真实地展示了XSLT有多么有缺陷和有缺陷.避免XSLT成为瘟疫:D (7认同)
  • +1.好的,我忘了你可以用这种方式使用()(并且使用索引器的方式很远). (5认同)
  • @Nik:我是一个真实的例子。我喜欢。:)。因为我喜欢 XSLT,如果您必须处理 XML,那么没有更好的语言了。 (5认同)
  • TIL:显然没有[first()]但你可以使用[1] (4认同)
  • @尼克。相反,它表明很少有人了解这种语言的力量。 (4认同)