Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 如何检查具有属性的最后一个元素?_Xslt - Fatal编程技术网

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

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:

<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
(如果可以的话):)