Xml XSL-如何判断元素是否是系列中的最后一个

Xml XSL-如何判断元素是否是系列中的最后一个,xml,xslt,Xml,Xslt,我有一个选择执行的XSL模板(见下文)。我想做的是能够判断我是否是最后一个匹配的单元 <xsl:template match="Unit[@DeviceType = 'Node']"> <!-- Am I the last Unit in this section of xml? --> <div class="unitchild"> Node: #<xsl:value-of select="@id"/> &

我有一个选择执行的XSL模板(见下文)。我想做的是能够判断我是否是最后一个匹配的
单元

  <xsl:template match="Unit[@DeviceType = 'Node']">
    <!-- Am I the last Unit in this section of xml? -->
    <div class="unitchild">
      Node: #<xsl:value-of select="@id"/>
    </div>
  </xsl:template>

节点:#
示例XML

<Unit DeviceType="QueueMonitor" Master="1" Status="alive" id="7">
    <arbitarytags />
    <Unit DeviceType="Node" Master="0" Status="alive" id="8"/>
    <Unit DeviceType="Node" Master="0" Status="alive" id="88"/>
</Unit>

您可以根据
last()
测试
position()


最后一个单位
节点:#

如果要测试它是否是同一级别的最后一个单元元素(具有相同的父元素),即使在之前、之后和之间有任意标记,也可以执行以下操作:

<xsl:if test="not(following-sibling::Unit)">

当前选择的答案通常不正确

然后在模板中匹配由
SomeExpression选择的节点:

<xsl:if test="position() = last()">
. . . . 
</xsl:if>
请注意,在这种情况下,不需要在模板中写入任何条件逻辑来测试当前节点是否为“最后一个”。

您应该测试position()=last(),但应该在谓词中测试,而不是在模板体中测试:

AAA
BBB
CCC
DDD
EEE
FFF


项目
上下文中的最后一个
最后一项

我试着查看
position()
,但是它也考虑了其他节点,即
,而不仅仅是
Unit
@Chris-它应该只使用模板范围内的节点。您可以尝试
/position()
,看看这是否有帮助。原始@test条件(不带
/
)为示例生成所需的输出,但是
position()
last()
对于这些单元元素分别为2:3和3:3。它不是根据模板匹配上下文(节点集)来评估
position()
last()
,而是根据文档顺序和作为父级子级的位置来评估。@Mads:这是不正确的<代码>位置()/<代码>和<代码> LAST()//>在模板内考虑当前上下文节点列表,而不是文档顺序。表达式
position()=last()
是否会产生预期结果取决于调用
所选择的节点集和排序顺序。请注意,如果使用正常标识转换-即
select=“node()|@*”
-测试将在提供样本输入的情况下失败,因为节点集中的最后一个节点将不是
单元
元素,而是表示最后一个
单元
元素后面的换行符和缩进的文本节点。不适用于任何XML文档和任何
!最初的问题是关于匹配的最后一个单位,而不是最后一个兄弟姐妹!匹配的最后一个单位是哪个仅取决于
select
属性中的表达式,而不取决于XML文档的物理属性。@Dimitre:它还取决于应用的排序顺序(如果有),而不仅取决于
select
属性中的表达式。问得好(+1)。请参阅我的答案,以了解到目前为止唯一正确的解决方案。请参阅我对当前所选答案的评论,以了解其不正确的原因。:)
<xsl:if test="position() = last()">
<xsl:if test="not(following-sibling::Unit)">
<xsl:apply-templates select="SomeExpression"/>
<xsl:if test="position() = last()">
. . . . 
</xsl:if>
<xsl:template match="Unit[last()]">
    . . . . 
</xsl:template>
<?xml version="1.0" encoding="utf-8"?>

<data>
    <item group="B">AAA</item>
    <item>BBB</item>
    <item group="B">CCC</item>
    <item>DDD</item>
    <item group="B">EEE</item>
    <item>FFF</item>
</data>
    <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="data">
    <xsl:apply-templates select="item[@group]"/>
</xsl:template>

<xsl:template match="item">
    ITEM
    <xsl:if test="position() = last()">
    LAST IN CONTEXT
    </xsl:if>
</xsl:template>

<xsl:template match="item[position() = last()]">
    LAST ITEM
</xsl:template>