Текущее время: Вс, сен 27 2020, 15:25

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: xslt трансформация, чтобы распарсить xml файл.
СообщениеДобавлено: Вт, мар 12 2019, 11:34 
Специалист
Специалист

Зарегистрирован:
Пн, мар 12 2012, 08:40
Сообщения: 166
Добрый день!
Может кто подскажет:
Есть xml файл в котором хранятся пришедшие заказы и их позиции. Хочу распарсить этот xml файл и получить на выходе
заголовки и позиции пришедших заказов. Но почему-то при применении моей xslt-трансформации заполняются только таблица заголовков заказа, а вложенная таблица позиций не заполняется(lt_table01-lines).
Пример входящего xml файла:
Code:
<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Order>
    <DOC_NUMBER>1</DOC_NUMBER>
    <DATE>2019-02-25</DATE>
    <Lines>
      <Line>
        <CODE>22</CODE>
      </Line>
      <Line>
        <CODE>23</CODE>
      </Line>
    </Lines>
  </Order>
    <DOC_NUMBER>2</DOC_NUMBER>
    <DATE>2019-02-25</DATE>
    <Lines>
      <Line>
        <CODE>24</CODE>
      </Line>
    </Lines>
  <Order>
  </Order>
</Root>


xslt трансформация:

Code:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" xmlns:asx="http://www.sap.com/abapxml" version="1.0">

  <xsl:strip-space elements="*"/>
  <xsl:output indent="yes"/>

  <xsl:template match="Root">
    <asx:abap version="1.0">
      <asx:values>
        <TABLE01>
          <xsl:for-each select="Order">
            <Line-Item>
              <DOC_NUMBER>
                <xsl:value-of select="DOC_NUMBER"/>
              </DOC_NUMBER>
              <DATE>
                <xsl:value-of select="DATE"/>
              </DATE>
              <Lines>
                  <xsl:for-each select="Lines/Line">
                    <Line-Item>
                      <CODE>
                        <xsl:value-of select="CODE"/>
                      </CODE>   
                    </Line-Item>
                  </xsl:for-each>
              </Lines>
            </Line-Item>
          </xsl:for-each>
        </TABLE01>
      </asx:values>
    </asx:abap>
  </xsl:template>

</xsl:transform>


Программа abap:
Code:

TYPES : BEGIN OF ts_table02,
          code    TYPE string,
        END OF ts_table02.

DATA: BEGIN OF ls_table01,
        doc_number        TYPE string,
        date              TYPE string,
        lines             TYPE TABLE OF ts_table02,
      END OF ls_table01.
DATA lt_table01 LIKE TABLE OF ls_table01.
DATA lt_table02 TYPE TABLE OF ts_table02.
i_xslt = 'ZORDER'.
TRY.
    ""Десериализация с помощью xslt трансформации
    CALL TRANSFORMATION  (i_xslt)
      SOURCE XML lv_xml_content
       RESULT
             table01 = lt_table01.


И на выходе вложенная таблица позиций не заполнена(lt_table01-lines).


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: xslt трансформация, чтобы распарсить xml файл.
СообщениеДобавлено: Вт, мар 12 2019, 14:54 
Специалист
Специалист

Зарегистрирован:
Пн, мар 12 2012, 08:40
Сообщения: 166
Разобрался, нельзя называть вложенную таблицу ключевым словом Lines.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: xslt трансформация, чтобы распарсить xml файл.
СообщениеДобавлено: Чт, фев 13 2020, 11:02 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, дек 12 2011, 17:42
Сообщения: 97
Здравствуйте, дамы и господа.
Нужна ваша помощь.

Использую простую трансформацию (ST) для формирования XML файла.
Элементы файла должны содержать префикс области имен: <УТ2:ИНН>

Трансформация выглядит так:
Code:
<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/...-templates">
<tt:root name="SRCDATA"/>

<tt:template>
<ЭДПФР xmlns="http://пф.рф/...." xmlns:УТ2="http://пф.рф/...">
  <СЗВ-ТД>
     <Работодатель>
        <УТ2:ИНН>
           <tt:value ref=".SRCDATA.INN"/>
        </УТ2:ИНН>
        <УТ2:КПП>
           <tt:value ref=".SRCDATA.KPP"/>
        </УТ2:КПП>
     </Работодатель>
  </СЗВ-ТД>
</ЭДПФР>
</tt:template>
</tt:transform>

на выходе имеем строку такого вида:
Code:
<ЭДПФР xmlns="http://пф.рф/....">
  <СЗВ-ТД>
     <Работодатель>
        <УТ2:ИНН xmlns:УТ2="http://пф.рф/...">123456789012</УТ2:ИНН>
        <УТ2:КПП xmlns:УТ2="http://пф.рф/...">12345678</УТ2:КПП>
     </Работодатель>
  </СЗВ-ТД>
</ЭДПФР>

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

Спасибо.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: xslt трансформация, чтобы распарсить xml файл.
СообщениеДобавлено: Чт, фев 13 2020, 12:46 
Специалист
Специалист

Зарегистрирован:
Пн, июл 11 2011, 10:50
Сообщения: 197
как то так

Code:
<СЗВ-ТД>
        <Работодатель>
          <УТ2:РегНомер>
            <xsl:value-of select=>
          </УТ2:РегНомер>
          <НаименованиеОрганизации>
            <xsl:value-of select=>
          </НаименованиеОрганизации>
          <УТ2:ИНН>
            <xsl:value-of select=>
          </УТ2:ИНН>
          <УТ2:КПП>
            <xsl:value-of select=>
          </УТ2:КПП>
        </Работодатель>
</СЗВ-ТД>


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: xslt трансформация, чтобы распарсить xml файл.
СообщениеДобавлено: Чт, фев 13 2020, 14:40 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, дек 12 2011, 17:42
Сообщения: 97
Уважаемый Bimit, спасибо за ответ.
Скажите, а разве префикс xsl не относится к XSLT трансформациям?

Я кажется нашел в хелпе, нужно в первом элементе указать explicit namespace declaration:
<tt:namespace name="УТ2" />
Code:
<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/...-templates"  xmlns:УТ2="http://пф.рф/...">
<tt:root name="SRCDATA"/>

<tt:template>
<ЭДПФР xmlns="http://пф.рф/....">
  <tt:namespace name="УТ2" />
  <СЗВ-ТД>
     <Работодатель>
        <УТ2:ИНН>
           <tt:value ref=".SRCDATA.INN"/>
        </УТ2:ИНН>
...
     </Работодатель>
  </СЗВ-ТД>
</ЭДПФР>
</tt:template>
</tt:transform>


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: xslt трансформация, чтобы распарсить xml файл.
СообщениеДобавлено: Пт, фев 14 2020, 10:20 
Специалист
Специалист

Зарегистрирован:
Пн, июл 11 2011, 10:50
Сообщения: 197
ISergiv написал(а):
Уважаемый Bimit, спасибо за ответ.
Скажите, а разве префикс xsl не относится к XSLT трансформациям?


Конечно это XSLT

тема так и называется :wink:

Самое простое создать XML файл с помощью XSLT

Code:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB