XSL найти последний узел

Мой XML такой.. Как я могу найти последний узел для текущего родительского идентификатора..

<I ID="958" ParentID="1" TOTAL="12"/>
<I ID="959"  ParentID="958"     TOTAL="0"/>
<I ID="960" ParentID="958" TOTAL="0"/>
<I ID="961" ParentID="958" TOTAL="0"/>
<I ID="962" ParentID="958" TOTAL="0"/>
<I ID="963" ParentID="958" TOTAL="0" />
<I ID="964" ParentID="958" TOTAL="0"/>
<I ID="965"  ParentID="958" TOTAL="0"/>
<I ID="964" ParentID="958"  TOTAL="0"/>
<I ID="967" ParentID="958" TOTAL="0"/>
<I ID="968" ParentID="958" TOTAL="0"/>
<I ID="969" ParentID="958" TOTAL="0" />
<I ID="970" ParentID="958" TOTAL="0" />
<I ID="971" ParentID="2" TOTAL="12"/>
<I ID="972" ParentID="971"  TOTAL="0"/>
<I ID="973" ParentID="971" TOTAL="0"/>
<I ID="974" ParentID="971" TOTAL="0"/>
<I ID="975" ParentID="971" TOTAL="0"/>
<I ID="976" ParentID="971" TOTAL="0" />
<I ID="977" ParentID="971" TOTAL="0"/>
<I ID="978"  ParentID="971" TOTAL="0"/>
<I ID="979" ParentID="971"  TOTAL="0"/>
<I ID="980" ParentID="971" TOTAL="0"/>
<I ID="981" ParentID="971" TOTAL="0"/>
<I ID="982" ParentID="971" TOTAL="0" />
<I ID="983" ParentID="971" TOTAL="0" />

Я хочу найти

 <I ID="970" ParentID="958" TOTAL="0" />
 <I ID="983" ParentID="971" TOTAL="0" />

и Хотите изменить дизайн для этого... XSLT 1.0


person Rocky111    schedule 07.11.2011    source источник
comment
Хороший вопрос, +1. Желаемые узлы могут быть выбраны с помощью одного простого и короткого выражения XPath.   -  person Dimitre Novatchev    schedule 07.11.2011
comment
@_Rocky111: Был ли мой ответ полезен для вас?   -  person Dimitre Novatchev    schedule 08.11.2011


Ответы (3)


Если вы находитесь сразу после последнего элемента I для данного ParentID, то следующее поможет

<xsl:copy-of select="I[@ParentID=$currentParentID][last()]"/>

Если вам нужен последний элемент I для каждого ParentID, то это должно сделать это

<xsl:for-each select="I">
    <xsl:if test="empty(following-sibling::I[@ParentID=current()/@ParentID])">
        <xsl:copy-of select="."/>
    </xsl:if>
</xsl:for-each>

Хороший краткий справочник по XLST можно найти по адресу http://www.mulberrytech.com/quickref/XSLT_1quickref-v2.pdf

person Tom Howard    schedule 07.11.2011
comment
я не понял, как это использовать..... ‹xsl:copy-of select=I[@ParentID=$currentParentID][last()]/› - person Rocky111; 07.11.2011
comment
Предполагается, что для $currentParentId задан какой-то конкретный ParentID. например, <xsl:variable name="currentParentID" select="958"/> - person Tom Howard; 08.11.2011

Вам необходимо сделать следующее:

  • Получите набор узлов всех элементов с родительским идентификатором первого родителя.
  • Получите количество всех элементов в этом наборе узлов.
  • Запустите if-then на этом наборе узлов, возвращая субъектный узел, если position() равно счету минус 1.

Будьте осторожны здесь. XML неупорядочен по своей природе. Без ключей нет никакой разницы между вторым и 13-м элементами, кроме того факта, что на этот раз они произошли именно в таком порядке. "Случилось" не гарантируется, что случится в другой раз. Ваш источник должен предоставить либо ключ заказа, либо какую-то другую причину, по которой эта 13-я строка отличается от 11-й перед ней.

Если вы предоставите свой существующий XSLT, я могу дать вам несколько советов по его изменению, чтобы включить это.

person ssamuel    schedule 07.11.2011

Это простое преобразование:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pId" select="958"/>

 <xsl:template match="/">
     <xsl:copy-of select="/*/I[@ParentID= $pId][last()]"/>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-документу:

<t>
    <I ID="958" ParentID="1" TOTAL="12"/>
    <I ID="959"  ParentID="958"     TOTAL="0"/>
    <I ID="960" ParentID="958" TOTAL="0"/>
    <I ID="961" ParentID="958" TOTAL="0"/>
    <I ID="962" ParentID="958" TOTAL="0"/>
    <I ID="963" ParentID="958" TOTAL="0" />
    <I ID="964" ParentID="958" TOTAL="0"/>
    <I ID="965"  ParentID="958" TOTAL="0"/>
    <I ID="964" ParentID="958"  TOTAL="0"/>
    <I ID="967" ParentID="958" TOTAL="0"/>
    <I ID="968" ParentID="958" TOTAL="0"/>
    <I ID="969" ParentID="958" TOTAL="0" />
    <I ID="970" ParentID="958" TOTAL="0" />
    <I ID="971" ParentID="2" TOTAL="12"/>
    <I ID="972" ParentID="971"  TOTAL="0"/>
    <I ID="973" ParentID="971" TOTAL="0"/>
    <I ID="974" ParentID="971" TOTAL="0"/>
    <I ID="975" ParentID="971" TOTAL="0"/>
    <I ID="976" ParentID="971" TOTAL="0" />
    <I ID="977" ParentID="971" TOTAL="0"/>
    <I ID="978"  ParentID="971" TOTAL="0"/>
    <I ID="979" ParentID="971"  TOTAL="0"/>
    <I ID="980" ParentID="971" TOTAL="0"/>
    <I ID="981" ParentID="971" TOTAL="0"/>
    <I ID="982" ParentID="971" TOTAL="0" />
    <I ID="983" ParentID="971" TOTAL="0" />
</t>

выдает желаемый правильный результат:

<I ID="970" ParentID="958" TOTAL="0"/>

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

person Dimitre Novatchev    schedule 07.11.2011