我有一个像这样的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
属性的最后一个节点?
答案 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()]">