Текущее время: Вт, фев 25 2020, 06:04

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


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


ВНИМАНИЕ!

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



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

Зарегистрирован:
Пн, мар 12 2012, 09:40
Сообщения: 160
Добрый день!
Может кто подскажет:
Есть 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, 15:54 
Специалист
Специалист

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


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

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

Использую простую трансформацию (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, 13:46 
Специалист
Специалист

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

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, 15:40 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, дек 12 2011, 18:42
Сообщения: 94
Уважаемый 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, 11:20 
Специалист
Специалист

Зарегистрирован:
Пн, июл 11 2011, 11:50
Сообщения: 196
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 + 4 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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