XSL - Как сказать, является ли элемент последним последовательно

У меня есть шаблон 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>
11
задан Dimitre Novatchev 15 January 2013 в 19:42
поделиться

4 ответа

Если вы хотите проверить, является ли он последним элементом Unit на том же уровне (с тем же родительским элементом), даже если есть произвольные теги до, после и между ними, то это будет работать:

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

Однако, если вы применяете шаблоны для подмножества, последний в документе может не быть в обрабатываемом множестве. Для этого можно проверить, что position() = last()

<xsl:if test="position() = last()">
8
ответ дан 3 December 2019 в 00:54
поделиться

Вы можете проверить 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.

4
ответ дан 3 December 2019 в 00:54
поделиться

Текущий ответ, как правило, неверен!

  
 

Это не будет работать с любым XML-документом и любыми

​​Исходный вопрос касается последнего сопоставленного Отряда , а не последнего брата! Какой из модулей соответствует последнему, зависит только от выражения в атрибуте select , а не от физических свойств XML-документа.

Способ сделать это :

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

затем в шаблоне, который соответствует узлам, выбранным SomeExpression :

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

Это проверяет, является ли текущий узел последним в узле -list выбран , а не то, что текущий узел является последним родственником . Это в точности отвечает на исходный вопрос.

Если вопрос был сформулирован иначе, спрашивая, как распознать, является ли последний родственный узел Блок текущим узлом, то лучшим решением было бы указать отдельный шаблон для этого последнего родственного узла:

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

Обратите внимание на , что в этом случае нет необходимости писать какую-либо условную логику внутри шаблона, чтобы проверить, является ли текущий узел «последним».

35
ответ дан 3 December 2019 в 00:54
поделиться

Вы должны проверить 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>

6
ответ дан 3 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: