Xslt 如何检查具有属性的最后一个元素?
我有这样一个xml:Xslt 如何检查具有属性的最后一个元素?,xslt,Xslt,我有这样一个xml: <xml> <node name="1">node1</node> <node name="2">node2</node> <node name="3">node3</node> <node>node4</node> </xml> 节点1 节点2 节点3 节点4 如何检查node3是否是具有@name属性的最后一个节点
<xml>
<node name="1">node1</node>
<node name="2">node2</node>
<node name="3">node3</node>
<node>node4</node>
</xml>
节点1
节点2
节点3
节点4
如何检查
node3
是否是具有@name
属性的最后一个节点?您可以在此处使用以下同级操作符。假设您位于节点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>
1.
应用于XML时,将输出以下内容
<xml>
<node name="1">node1</node>
<node name="2">node2</node>
<node last="1" name="3">node3</node>
<node>node4</node>
</xml>
节点1
节点2
节点3
节点4
编辑:实际上,在模板匹配中,您可以在此处使用last。下面的模板匹配也应该有效
<xsl:template match="node[@name][last()]">
您刚才使用了以下代码:
<xsl:template match="/node/[@name='3'][last()]">
@GungFoo,哦,来吧。我尝试了position()=last()
,但这似乎检查了这种类型的最后一个节点。测试test=“../@name[position()=last()]”
也不起作用。您通常谈论XML,就像leoPark在回答中所问的那样。。。你用什么来解析这个XML?请阅读有关如何提问的常见问题:@冈福,请多加注意。该标记非常清楚地表明它是XSL
。这些标记不仅用于回答您的问题,而且还可以让将来搜索的人更容易找到这些问题。这也是为什么一个完全成熟的问题更受欢迎的原因,输入“Whatyouhavetry.com”和一个可接受的正确答案是什么样子。你应该努力写你的问题,就像有人必须回答一样。这有助于那些愿意回答你问题的人和将来遇到你问题的人。再说一遍,我不必解释这个。好吧,但是如果@name不是3
?=)oXmlDocument.DocumentElement.LastChild.SelectSingleNode(“name”).text,再一次,它是XSL
=)谢谢,我不知道跟随同级
函数。@svz跟随同级
是一个轴,不是一个函数。听起来我可能有点迂腐,但您需要知道正确的术语,以便将来能够理解文档…@IanRoberts,谢谢=)事实上,我还不太熟悉XSL,所以我发现很多事情都很奇怪和困惑。@svz确实,xslt作为一种功能性语言,需要与过程性语言或OO语言截然不同的思维方式。值得坚持并熟悉模板匹配方法-避免再次陷入xsl:for each
和xsl:choose
(如果可以的话):)