Модераторы: diadiavova
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [XSLT] xsl:sort и множественное вложение, Помогите разобраться в xsl и xpath 
:(
    Опции темы
SwordOfDeath
  Дата 23.9.2010, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Не ожидал что будет так сложно понять данную тему поэтому прошу помощи.
Помогите разобраться с xsl:sort

Задача отсортировать xml (xml->sort->xml)

Исходник (XML):
Код

<?xml version="1.0" encoding="UTF-8"?>
<item>
  <element id="hello" name="Hello" order="0">
    <element id="123" name="1234" order="1"/>
    <element id="hi" name="Привет" order="4"/>
  </element>
  <element id="index" name="Home" order="1">
    <element id="test-page" name="Test Page" order="0"/>
    <element id="test-menu" name="Second Test Page" order="0"/>
  </element>
</item>


Должно получится (XML):
Код

<?xml version="1.0" encoding="UTF-8"?>
<item>
  <element id="index" name="Home" order="1">
    <element id="test-menu" name="Second Test Page" order="0"/>
    <element id="test-page" name="Test Page" order="0"/>
  </element>
  <element id="hello" name="Hello" order="0">
    <element id="hi" name="Привет" order="4"/>
    <element id="123" name="1234" order="1"/>
  </element>
</item>


Пробую (XSL):
Код

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml"/>
    <xsl:template match="element">
        <xsl:copy>
            <xsl:apply-templates>
                <xsl:sort select="@order" data-type="number"/>
                <xsl:sort select="@name"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>


Результат (XML):
Код

<?xml version="1.0"?>
<element><element/><element/></element>
<element><element/><element/></element>


Не могу в этом разобраться вообще.
Получится ли такой трюк с множественными вложениями?

Это сообщение отредактировал(а) SwordOfDeath - 23.9.2010, 23:32
PM MAIL   Вверх
diadiavova
Дата 24.9.2010, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



SwordOfDeath, ты не копируешь атрибуты. В соседней теме я привел пример с копированием, посмотри там как это делается.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
SwordOfDeath
Дата 24.9.2010, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Выводит то же самое:
Код

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml"/>
    <xsl:template match="element | @*">
        <xsl:variable name="id" select="@id"/>
        <xsl:variable name="name" select="@name"/>
        <xsl:variable name="order" select="@order"/>
        <xsl:copy>
            <xsl:apply-templates>
                <xsl:sort select="@order" order="descending" data-type="number"/>
                <xsl:sort select="@name" order="ascending" data-type="text"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

PM MAIL   Вверх
SwordOfDeath
  Дата 24.9.2010, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Методом тыка добился относительно правильного результата(верхний уровень не сортируется) вот этим XSL:
Код

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <item>
            <xsl:apply-templates/>
        </item>
    </xsl:template>
    <xsl:template match="element | @*">
        <xsl:copy>
            <xsl:apply-templates select="element | @*">
                <xsl:sort select="@order" order="descending" data-type="number"/>
                <xsl:sort select="@name" order="ascending" data-type="text"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>


Абсолютный метод тыка, буду очень признателен если подскажите почему не сортирует верхний уровень(все остальные сортируются правильно).
И как сделать кодировку UTF-8. Пробовал из PHP вот так:
Код

        $document = new DOMDocument('1.0', 'UTF-8');
        . . .
        $xslt = new DOMDocument('1.0','UTF-8');
        $xslt->loadXML(file_get_contents('sort.xslt'));
        $xslt_proc = new XSLTProcessor;
        $xslt_proc->importStyleSheet($xslt);
        $xslt_proc->transformToDoc($document)->save('menu.xml');
и так:
Код

        $document = new DOMDocument('1.0', 'UTF-8');
        . . .
        $xslt = new DOMDocument('1.0','UTF-8');
        $xslt->loadXML(file_get_contents('sort.xslt'));
        $xslt_proc = new XSLTProcessor;
        $xslt_proc->importStyleSheet($xslt);
        $document->loadXML($xslt_proc->transformToXml($document));
        $document->save('menu.xml');

А кириллицу выводит так "&#x425;&#x430;&#x439;"
Все XSL и XML "<?xml version="1.0" encoding="UTF-8"?>"

Это сообщение отредактировал(а) SwordOfDeath - 24.9.2010, 04:16
PM MAIL   Вверх
diadiavova
Дата 24.9.2010, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(SwordOfDeath @  24.9.2010,  04:31 Найти цитируемый пост)
 почему не сортирует верхний уровень

Потому что для него тоже надо указать параметры сортировки
Код

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <item>
            <xsl:apply-templates select="item/element">
                <xsl:sort select="@order" order="descending" data-type="number"/>
            </xsl:apply-templates>
        </item>
    </xsl:template>
    <xsl:template match="element">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="element">
                <xsl:sort select="@order" order="descending" data-type="number"/>
                <xsl:sort select="@name" order="ascending" data-type="text"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Из корневого шаблона ты вызываешь обработку этих узлов без сортировки.

Цитата(SwordOfDeath @  24.9.2010,  04:31 Найти цитируемый пост)
 как сделать кодировку UTF-8. Пробовал из PHP вот так:

Про пхп ничего не могу сказать. В соответствующем разделе помогут быстрее.

Это сообщение отредактировал(а) diadiavova - 24.9.2010, 12:58


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
SwordOfDeath
Дата 25.9.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Как оказалось дело вовсе не в PHP!
Нужно было указать кодировку вот так
Код

<xsl:output method="xml" encoding="UTF-8" indent="yes"/>

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась.

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.