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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование плоского XML в стуктурный 
:(
    Опции темы
dani1
Дата 30.10.2008, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Уважаемые участники, помогите пожалуйста понять в чем ошибка. Я пока совсем новичок в XSLT

Мне нужно преобразовать "плоский" ХМL в ХМL  "древообразный".

Вот пример  входящего XML:
Код

<root>
<Invoice>
<InvType></InvType>
<InvNum></InvNum>
</Invoice>
<Delivery>
<DeliveryType></DeliveryType>
<DeliveryNum></DeliveryNum>
<Amount></Amount>
<InvNum></InvNum>
</Delivery>
<Line>
<LineNum></LineNum>
<LineType></LineType>
<DeliveryNum></DeliveryNum>
</Line>
</root>


А вот что должно получится:

Код

<root>
<Invoice>
   <InvType></InvType>
   <InvNum></InvNum>
      <Delivery>
            <DeliveryType></DeliveryType>
            <DeliveryNum></DeliveryNum>
            <Amount></Amount>
            <InvNum></InvNum>
         <Line>
               <LineNum></LineNum>
               <LineType></LineType>
               <DeliveryNum></DeliveryNum>
        </Line>
   </Delivery>
</Invoice>
</root>



Вот мой код:
Код

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <root>
            <xsl:for-each-group select="root/Invoice" group-by="InvNum">
                <Invoice>
                    <InvType>
                        <xsl:value-of select="InvType"/>
                    </InvType>
                    <InvNum>
                        <xsl:value-of select="InvNum"/>
                    </InvNum>

                    <xsl:for-each select="../Delivery[InvNum=current-grouping-key()]">

                        <Delivery>
                            <DeliveryNum>
                                <xsl:value-of select="DeliveryNum"/>
                            </DeliveryNum>
                            <DeliveryType>
                                <xsl:value-of select="DeliveryType"/>
                            </DeliveryType>
                            <Amount>
                                <xsl:value-of select="Amount"/>
                            </Amount>

                            <xsl:for-each select="../Line[DeliveryNum=../Delivery/DeliveryNum]">
                            
                                <Line>
                                    <LineNum>
                                        <xsl:value-of select="LineNum"/>
                                    </LineNum>
                                    <LineType>
                                        <xsl:value-of select="LineType"/>
                                    </LineType>
                                    <DeliveryNum>
                                        <xsl:value-of select="DeliveryNum"/>
                                    </DeliveryNum>
                                </Line>
                            </xsl:for-each>
                        </Delivery>
                    </xsl:for-each>
                </Invoice>
            </xsl:for-each-group>
        </root>
    </xsl:template>
</xsl:stylesheet>





В результате с элементами <Line> получается путаница, вместо того чтобы взять только те у которых <DeliveryNum> совпадает с <DeliveryNum> в <Delivery> он берет только первый встречный <Line> и лепит его всем подряд.

Вот пример.

Входящий:


Код

<root>
    <Invoice>
        <InvType>0</InvType>
        <InvNum>111</InvNum>
    </Invoice>
    <Delivery>
        <DeliveryType>1</DeliveryType>
        <DeliveryNum>111</DeliveryNum>
        <Amount>100.00</Amount>
        <InvNum>111</InvNum>
    </Delivery>
    <Line>
        <LineNum>1</LineNum>
        <LineType>ww</LineType>
        <DeliveryNum>111</DeliveryNum>
    </Line>
    <Delivery>
        <DeliveryType>1</DeliveryType>
        <DeliveryNum>222</DeliveryNum>
        <Amount>200.00</Amount>
        <InvNum>111</InvNum>
    </Delivery>
    <Line>
        <LineNum>1</LineNum>
        <LineType>uu</LineType>
        <DeliveryNum>333</DeliveryNum>
    </Line>
    <Invoice>
        <InvType>0</InvType>
        <InvNum>333</InvNum>
    </Invoice>
    <Delivery>
        <DeliveryType>1</DeliveryType>
        <DeliveryNum>555</DeliveryNum>
        <Amount>300.00</Amount>
        <InvNum>333</InvNum>
    </Delivery>
    <Line>
        <LineNum>1</LineNum>
        <LineType>we</LineType>
        <DeliveryNum>222</DeliveryNum>
    </Line>
</root>



А вот что получается в результате:
Код

<?xml version="2.0"?>
<root>
    <Invoice>
        <InvType>0</InvType>
        <InvNum>111</InvNum>
        <Delivery>
            <DeliveryNum>111</DeliveryNum>
            <DeliveryType>1</DeliveryType>
            <Amount>100.00</Amount>
            <Line>
                <LineNum>1</LineNum>
                <LineType>ww</LineType>
                <DeliveryNum>111</DeliveryNum>
            </Line>
        </Delivery>
        <Delivery>
            <DeliveryNum>222</DeliveryNum>
            <DeliveryType>1</DeliveryType>
            <Amount>200.00</Amount>
            <Line>
                <LineNum>1</LineNum>
                <LineType>ww</LineType>
                <DeliveryNum>111</DeliveryNum>
            </Line>
        </Delivery>
    </Invoice>
    <Invoice>
        <InvType>0</InvType>
        <InvNum>333</InvNum>
        <Delivery>
            <DeliveryNum>555</DeliveryNum>
            <DeliveryType>1</DeliveryType>
            <Amount>300.00</Amount>
            <Line>
                <LineNum>1</LineNum>
                <LineType>ww</LineType>
                <DeliveryNum>111</DeliveryNum>
            </Line>
        </Delivery>
    </Invoice>
</root>





Подскажите пожалуйста что делать?

С уважением,
Даниил





Это сообщение отредактировал(а) dani1 - 30.10.2008, 18:54
PM MAIL   Вверх
jsa
Дата 31.10.2008, 04:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

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



Код

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" />
    <xsl:template match="/">
        <root>
            <xsl:for-each-group select="root/Invoice" group-by="InvNum">
                <Invoice>
                    <InvType>
                        <xsl:value-of select="InvType"/>
                    </InvType>
                    <InvNum>
                        <xsl:value-of select="InvNum"/>
                    </InvNum>

                    <xsl:for-each select="../Delivery[InvNum=current-grouping-key()]">
                        <xsl:variable name="deliv" select="." />
                        <Delivery>
                            <DeliveryNum>
                                <xsl:value-of select="DeliveryNum"/>
                            </DeliveryNum>
                            <DeliveryType>
                                <xsl:value-of select="DeliveryType"/>
                            </DeliveryType>
                            <Amount>
                                <xsl:value-of select="Amount"/>
                            </Amount>

            <xsl:for-each select="following-sibling::Line[DeliveryNum/text() = $deliv/DeliveryNum/text()]">
                            
                                <Line>
                                    <LineNum>
                                        <xsl:value-of select="LineNum"/>
                                    </LineNum>
                                    <LineType>
                                        <xsl:value-of select="LineType"/>
                                    </LineType>
                                    <DeliveryNum>
                                        <xsl:value-of select="DeliveryNum"/>
                                    </DeliveryNum>
                                </Line>
                            </xsl:for-each>
                        </Delivery>
                    </xsl:for-each>
                </Invoice>
            </xsl:for-each-group>
        </root>
    </xsl:template>
</xsl:stylesheet>



--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
dani1
Дата 2.11.2008, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



  
jsa 
Большое спасибо!

Это сообщение отредактировал(а) dani1 - 2.11.2008, 09:13
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

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

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

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

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


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

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


 




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


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

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