代码之家  ›  专栏  ›  技术社区  ›  Chris

xsl-如何判断元素是否是序列中的最后一个元素

  •  11
  • Chris  · 技术社区  · 14 年前

    我有一个选择执行的XSL模板(如下)。我想做的是能分辨出我是否是最后一个 Unit 相配。

      <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>
    
    4 回复  |  直到 14 年前
        1
  •  8
  •   Mads Hansen    7 年前

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

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

    但是,如果要为子集应用模板,文档中的最后一个模板可能不在正在处理的集合中。为此,您可以测试 position() = last()

    <xsl:if test="position() = last()">
    
        2
  •  33
  •   Dimitre Novatchev    14 年前

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

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

    这不适用于任何XML文档和 <xsl:apply-templates>

    最初的问题是关于最后一个 Unit 正在配对,不是最后一个兄弟!最后一个匹配的单元取决于的select属性中的表达式。 <xsl:apply模板> ,而不是XML文档的物理属性。

    做这件事的方法 :

    <xsl:apply-templates select="SomeExpression"/>
    

    然后在与所选节点匹配的模板中 SomeExpression :

    <xsl:if test="position() = last()">
    . . . . 
    </xsl:if>
    

    这将检查当前节点是否是 node-list 通过选择 <xsl:apply模板> 不是当前节点是最后一个同级 . 这正好回答了最初的问题。

    如果问题是以不同的方式提出的,询问如何识别最后一个兄弟姐妹 单位 是当前节点,那么最好的解决方案是为此最后一个同级节点指定单独的模板:

    <xsl:template match="Unit[last()]">
        . . . . 
    </xsl:template>
    

    做笔记 在这种情况下,不需要在模板中编写任何条件逻辑来测试当前节点是否为“最后一个”。

        3
  •  6
  •   shabunc    14 年前

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

    <?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>
    

        4
  •  4
  •   Oded    14 年前

    你可以测试 position() 反对 last() :

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

    参见W3Schools文章 xsl:if .