如何检查具有属性的最后一个元素?

时间:2013-01-18 08:46:24

标签: xslt

我有一个像这样的xml:

<xml>
    <node name="1">node1</node>
    <node name="2">node2</node>
    <node name="3">node3</node>
    <node>node4</node>
</xml>

如何检查<node name="3">node3</node>是具有@name属性的最后一个节点?

2 个答案:

答案 0 :(得分:1)

您可以在此处使用 follow-sibling 运算符。假设您被定位在节点 elemenet上,您只需要检查当前节点是否具有名称属性,但没有跟随兄弟节点

<xsl:if test="@name and not(following-sibling::node[@name])">

这也可以作为模板匹配的一部分来完成

<xsl:template match="node[@name][not(following-sibling::node[@name])]">

例如,尝试以下XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="node[@name][not(following-sibling::node[@name])]">
        <xsl:copy>
                <xsl:attribute name="last">1</xsl:attribute>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

应用于XML时,输出以下内容

<xml>
   <node name="1">node1</node>
   <node name="2">node2</node>
   <node last="1" name="3">node3</node>
   <node>node4</node>
</xml>

编辑:实际上,在模板匹配中,您可以在此处使用最后。以下模板匹配也应该有效。

<xsl:template match="node[@name][last()]">

答案 1 :(得分:0)

您刚使用此代码:

<xsl:template match="/node/[@name='3'][last()]">