XSL Найти последний узел - PullRequest
1 голос
/ 07 ноября 2011

Мой 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

Ответы [ 3 ]

1 голос
/ 07 ноября 2011

Если вы находитесь сразу за последним элементом 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

0 голосов
/ 07 ноября 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 передается преобразованию как глобальный внешний параметр, что делает его многократно используемым.

0 голосов
/ 07 ноября 2011

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

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

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

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

...