Xml XSL-如何判断元素是否是系列中的最后一个
我有一个选择执行的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: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>