-1

我有一个这样的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属性的最后一个节点?

4

2 回答 2

1

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

<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>

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

<xsl:template match="node[@name][last()]">
于 2013-01-18T08:57:33.400 回答
0

你刚刚使用了这段代码:

<xsl:template match="/node/[@name='3'][last()]"> 
于 2013-01-18T09:02:28.590 回答