Сортировка по материнскому и дочернему атрибуту

Валерьян

Новичок
есть такой XML
Код:
<item></item>
<item></item>
<item>
    <modifications>
        <item></item>
        <item></item>
    </modifications>
</item>
<item></item>
требуется отсортировать по всем item/@datetime, где
если
Код:
<xsl:when test="count(modifications/item) > 0">
, тогда
Код:
<xsl:value-of select="modifications/item[last()]/datetime"/>
я думаю, ясная задача, да?
Мне предложили решение использовать временное дерево:

Код:
<xsl:variable name="tmp">
     <xsl:apply-templates select="item"/>
<xsl:variable>

<xsl:for-each select="msxsl:node-set($tmp)">
     <xsl:sort />
</xsl:for-each>

<xsl:template match="item">
      <item>
         <xsl:attribute name="datetime">
                <xsl:choose>.определение значения datetime..</xsl:choose>
         </xsl:attribute>
             <xsl:copy-of select="*"/>
       </item>
</xsl:template>
сделал, атрибут добавляется, создается новый набор
<item></item> с нужными значениями атрибута и пытаюсь отсортировать
Код:
<xsl:for-each select="exsl:node-set($item_tmp)/item">
        <xsl:sort  select = "@new_datetime" order="descending"/>
        <xsl:apply-templates select="item" />
</xsl:for-each >
теперь вверху страницы, над форматированным выводом, выводится неформатированная куча всего содержимого
Код:
<xsl:copy-of select="*"/>
и я чувствую, что я много чего не понимаю, помогите ,а?
 

WMix

герр M:)ller
Партнер клуба
если @datetime легко сортируется как стринг (к примеру yyyy-mm-dd hh:ii:ss) то по идеи все проще

PHP:
<xsl:template match="//item">
  <xsl:for-each select="./modifications/item">
    <xsl:sort select = "@datetime" order="descending"/>
    <xsl:value-of select="." /><!-- или что там нужно -->
  </xsl:for-each >
</xsl:template>
 

Валерьян

Новичок
кажется ты не понял, если встречается <item>, у которой есть модификации, то вместо item/@datetime для сортировки нужно брать одну из item/modifications/item/@datetime, понял?
 

WMix

герр M:)ller
Партнер клуба
нет, как это сортировать по одному значению?
 

Валерьян

Новичок
если у модификации недавно изменился datetime, то этот datetime считать как актуальный для сортировки материнского item, понимаешь? вот я и нарисовал временное дерево, у него как раз принимается актуальный атрибут для item, в случае обновления datetime у дочерней модификации

если просто сортировать товары по времени, то это же не проблема, они и так сортируются на стадии PHP-выборки из базы
 

WMix

герр M:)ller
Партнер клуба
слушай, нарисуй валидный xml с использованием @datetime а также результирующий. мне так все слишком абстрактно
 

Валерьян

Новичок
Вот скажи пожалуйста, что должен вывести шаблон ?:
Код:
<xsl:apply-templates select="item" />
<xsl:template match="item">
    <item>
        <xsl:attribute name="name">
            <xsl:choose>
                  <!--некоторое условия для создания атрибута-->
            </xsl:choose>
        </xsl:attribute>
        <xsl:copy-of select="*"/>
    </item>
  <!--код шаблона-->
</xsl:template>
и будет ли отличие от
Код:
<xsl:apply-templates select="item" />
<xsl:template match="item">
  <!--код шаблона-->
</xsl:template>
 

WMix

герр M:)ller
Партнер клуба
в первом случае ты создал <item name="то что choose вернет"> копия любых детей </item> + шаблон
во втором просто шаблон
 

Валерьян

Новичок
как выполняется это преобразование?
Элементу item добавляется новый атрибут и копируется все дети элемента item, верно?
а тот код XSL, что остался за бортом <item></item> выполняется или нет?
Я имею ввиду, происходит ли повторение преобразования внутри и вне <item></item>?
 

WMix

герр M:)ller
Партнер клуба
как выполняется это преобразование?
толпа индусов правит пальчиками.
и копируется все дети элемента item, верно?
только если это написано, само по себе нет!
а тот код XSL, что остался за бортом <item></item> выполняется или нет?
некий текст, хоть даже xml не отменяет инстукции xsl
Я имею ввиду, происходит ли повторение преобразования внутри и вне <item></item>?
сколько раз истина столько раз исполнится код!

может всеже книжку или ман почитать?
 

Валерьян

Новичок
у меня пока нет четкого понимания как процессор работает, книга валикова - вот она, про XML внутри XSL не нахожу, ..мне бы глянуть примеры использования XML внутри шаблонов, не подскажешь?
 

WMix

герр M:)ller
Партнер клуба
внутри шаблона xml это текст такойже как echo в php, но его можно использовать и парсить еще раз как в предыдушем примере когда ты сформировал временное дерево
exsl:node-set($item_tmp)/item
правда это уже не совсем xls )
 

Валерьян

Новичок
не, ну не настолько же! )) ну в некоторых местах есть пробелы ( .... спасибо за книги, ..
вы лучше предложите решение задачи иное, нежели используя временное дерево)
 

WMix

герр M:)ller
Партнер клуба
PHP:
<xsl:sort select="modifications/item[last()]/@datetime|@datetime" order="descending"/>
 

Валерьян

Новичок
неа, я это уже пробовал, сортировка игнорируется, потому что когда у элемента item нет вложенных modification, то выражение ничего не возвращает
 

WMix

герр M:)ller
Партнер клуба
1.xml
PHP:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="sort.xsl" ?>
<root>
    <item datetime="2012-12-12 12:12:14" val="01" />
    <item datetime="2012-12-12 12:12:22" val="02" />
    <item val="03">
        <modifications>
            <item datetime="2012-12-12 12:12:12" />
            <item datetime="2012-12-12 12:12:23" />
        </modifications>
    </item>
    <item datetime="2012-12-12 12:12:11" val="04" />
</root>
sort.xsl
PHP:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="text"/>

    <xsl:template match="/">
        <xsl:for-each select="root/item">
            <xsl:sort select="modifications/item[last()]/@datetime|@datetime" order="descending"/>
            <xsl:value-of select="@val"/>
        </xsl:for-each >
    </xsl:template>

</xsl:stylesheet>
Код:
$  java -jar saxon9he.jar -s:1.xml -xsl:sort.xsl -o:1.txt
$  cat 1.txt
03020104
 

WMix

герр M:)ller
Партнер клуба
когда у элемента item нет вложенных modification, то выражение ничего не возвращает
когда у элемента item нет вложенных modification - это false срабатывает |@datetime
 
Сверху