我有一个这样的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
属性的最后一个节点?
我有一个这样的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
属性的最后一个节点?
您可以在此处使用以下兄弟运算符。假设您位于节点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()]">
你刚刚使用了这段代码:
<xsl:template match="/node/[@name='3'][last()]">