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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> xsl:sort и preceding-sibling.чем можно заменить? 
:(
    Опции темы
ББС
Дата 24.11.2008, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть xml file 
Код

<FixedPart>
 <NameCKP>ABC</NameCKP>
 <Type>20</Type>
</FixedPart>
<FixedPart>
 <NameCKP>ABC</NameCKP>
 <Type>01</Type>
</FixedPart>
<FixedPart>
 <NameCKP>ABC</NameCKP>
 <Type>01</Type>
</FixedPart>

Надо получить отсортированную(в порядке возрастания типа и имени)таблицу состоящую из имени и типа.И убрать повторяющиеся элементы.Все дело в том ,что preceding-sibling строит ось по исходному документу а не по отсортированому???Пока придумать не могу.
PM MAIL   Вверх
Juggernaut
Дата 24.11.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я это вижу примерно так:

Исходный файл, например table.xml:
Код

<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="table.xsl"?>
<FixedParts>
<FixedPart>
     <NameCKP>ABC</NameCKP>
     <Type>20</Type>
</FixedPart>
<FixedPart>
     <NameCKP>ABC</NameCKP>
     <Type>01</Type>
</FixedPart>
<FixedPart>
     <NameCKP>ABC</NameCKP>
     <Type>01</Type>
</FixedPart>
</FixedParts>

Я от себя добавил узел верхнего уровня, для удобства.
Файл с XSLT, например table.xsl:
Код

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="FixedParts">
    <html>
    <body>
      <table border="1">  
      <xsl:for-each-group select="FixedPart" group-by="Type">
        <xsl:sort select="current-grouping-key()"/>
            <tr>  
            <td><xsl:value-of select="Type"/></td>  
            <xsl:for-each-group select="current-group()" group-by="NameCKP" >
                    <xsl:sort select="NameCKP"/>
                    <td><xsl:value-of select="NameCKP"/></td>  
            </xsl:for-each-group>
            </tr> 
        </xsl:for-each-group>
        </table>
    </body>
    </html>
</xsl:template>
</xsl:stylesheet>


Собственно все. Правда все это работает только с процессорами, поддерживающими XSLT 2.0.
Я использовал Saxon9.

PM MAIL   Вверх
ББС
Дата 24.11.2008, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



К сожелению надо XSLT 1.0.
Не совсем понимаю как это будет работать.
Группирует по типу,потом сортирует(находит наименьший допустим 01).Затем группирует по именам (находит наименьший допустим ABC).
И выводит?
Не может ли получиться так что имя и тип ,которые выведутся ,будут относиться к разным узлам? 
PM MAIL   Вверх
ББС
Дата 24.11.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я сделал следующим образом .
Код

<table border="1">
                    <xsl:for-each select="FixedParts">
                        <xsl:sort select="FixedPart/Type"/>
                        <xsl:sort select="FixedPart/NameCKP"/>
                        <xsl:if test="not(preceding-sibling::*[FixedPart/Type=current()/FixedPart/Type and FixedPart/NameCKP=current()/FixedPart/NameCKP])">
                            <tr>
                                <td>
                                    <xsl:value-of select="FixedPart/Type"/>
                                </td>
                                <td>
                                    <xsl:value-of select="FixedPart/NameCKP"/>
                                </td>
                                                                                      <tr>
                                                                          </xsl:if>
                                                   </xsl:for-each>
                </table>  

Но дело в том ,что XML file большой .И preceding-sibling занимает много времени.
Вместо того чтобы сравнить только с предыдущим приходиться сравнивать практически со всеми узлами.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

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

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

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

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


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

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


 




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


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

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