Текущее время: Пт, июл 18 2025, 23:17

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: XSLT преобразование вложенной структуры
СообщениеДобавлено: Вт, апр 01 2014, 21:01 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Добрый день!
Подскажите пожалуйста, как работать с вложенными структурами в XSLT преобразованиях?
Есть структура, одно из полей которой - ссылка на внутр.таблицу. В основе внутр.таблицы - сама эта структура.
Хочу получить на основе структуры XML. Почему-то, после преобразования, в результирующей строке появляются лишние данные (данные той самой внутр. таблицы).
вот программа
Code:
TYPES
  : BEGIN OF tdeep_struct
    , name TYPE string
    , date TYPE sy-datum
    , rf_child_list TYPE REF TO data
  , END OF tdeep_struct

  , t_deep_struct TYPE STANDARD TABLE OF tdeep_struct
                    WITH NON-UNIQUE DEFAULT KEY
  .

DATA
  : gtree   type tdeep_struct
  , gchild  type tdeep_struct
  , gxml_str type string
  .

FIELD-SYMBOLS
  : <gt_child_list> TYPE t_deep_struct
  .

START-OF-SELECTION.

  gtree-name = 'Root'.
  gtree-date = sy-datum.

  CREATE DATA gtree-rf_child_list TYPE t_deep_struct.

  ASSIGN gtree-rf_child_list->* TO <gt_child_list>.

  gchild-name = 'Child'.
  gchild-date = sy-datum + 20.

  APPEND gchild TO <gt_child_list>.

  call TRANSFORMATION ZTRANSFORM
    SOURCE
      param = gtree
    RESULT XML gxml_str.


вот преобразование
Code:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">

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

  <xsl:template match="PARAM">
    <NAME>
      <xsl:value-of select="NAME"/>
    </NAME>
    <DATE>
      <xsl:value-of select="DATE"/>
    </DATE>
  </xsl:template>

</xsl:transform>


На выходе ожидаю увидеть
Code:

<?xml version="1.0" encoding="utf-16"?>
<NAME>Root</NAME>
<DATE>2014-04-01</DATE>


а получаю
Code:
<?xml version="1.0" encoding="utf-16"?>
<NAME>Root</NAME>
<DATE>2014-04-01</DATE>
Child2014-04-21


Что я делаю не так?

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XSLT преобразование вложенной структуры
СообщениеДобавлено: Вт, апр 01 2014, 23:13 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Code:
<xsl:for-each select="//PARAM/*">
  <NAME>
    <xsl:value-of select="NAME"/>
  </NAME>
  <DATE>
    <xsl:value-of select="DATE"/>
  </DATE>
</xsl:for-each>


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: XSLT преобразование вложенной структуры
СообщениеДобавлено: Ср, апр 02 2014, 07:20 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Пономарев Артем: не-а, не сработало. Этот код куда вставить надо? Я пробовал им заменить код между <xsl:template><\xsl:template>
И просто заменить весь код на указанный. Все равно выводится не то что нужно.
Опять же for-each это же вроде бы для таблицы? а у меня структура, одиночный элемент. не?

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XSLT преобразование вложенной структуры
СообщениеДобавлено: Ср, апр 02 2014, 08:44 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
Code:
  call TRANSFORMATION ZTRANSFORM
    SOURCE
      param = gtree  * можжет тут gtree -> gchild?
    RESULT XML gxml_str.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: XSLT преобразование вложенной структуры
СообщениеДобавлено: Ср, апр 02 2014, 09:21 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
AFH: не-не-не! поясню словами: мне нужно в xml засунуть поля только самой структуры, но не ее детей. Вы же предлагаете мне передать таблу Child_list. Но мне в XML не нужна эта инфа вообще.

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XSLT преобразование вложенной структуры
СообщениеДобавлено: Ср, апр 02 2014, 10:15 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Кодер, сорри. Пропустил что вы структуру подаете, а не таблицу. Убрали бы избыточный код из листинга :)

У вас все правильно написано. Просто трансформация не умеет корректно работать с генерик тайпами. Поменяйте код, для примера, на:
Code:
TYPES
  : BEGIN OF tdeep_struct
    , name TYPE string
    , date TYPE sy-datum
    , rf_child_list TYPE STANDARD TABLE OF bkpf WITH DEFAULT KEY
  , END OF tdeep_struct.

DATA
  : gtree   TYPE tdeep_struct
  , gchild  TYPE bkpf
  , gxml_str TYPE string
  .

START-OF-SELECTION.

  gtree-name = 'Root'.
  gtree-date = sy-datum.

  gchild-mandt = sy-mandt.
  gchild-bukrs = '1000'.
  gchild-belnr = '100000000'.
  gchild-gjahr = '2014'.

  APPEND gchild TO gtree-rf_child_list.

  call TRANSFORMATION ZTRANSFORM
    SOURCE
      param = gtree
    RESULT XML gxml_str.

Получите что ожидаете.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: XSLT преобразование вложенной структуры
СообщениеДобавлено: Ср, апр 02 2014, 10:35 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Пономарев Артем: я думаю, что все-таки умеет оно с generic нормально работать. Проблема в том, что я просто не знаю, как это обрабатывать в XSLT. В отладке я вижу, что структура GTREE преобразуется в asXML строго по хелпу. Мне не хватает знаний как такое в XSLT надо интерпретировать.
При этом, отказаться от вложенности с generic я не могу, т.к. по сути речь идет о дереве, и я не могу объявить в структуре ссылку ни на саму себя, ни на таблицу из этой же структуры (синт. проверка не даст сгенерировать код).
Не, как обойти я знаю.. благо полей немного - могу их просто как параметры передавать в трансформацию. Но хотелось бы еще и красиво сделать.
А код в листинге не избыточный, он же как раз демонстрирует проблему.

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XSLT преобразование вложенной структуры
СообщениеДобавлено: Ср, апр 02 2014, 10:58 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Кодер, ни, не умеет. Структуры то нет.
Что касается деревьев, то вам никто не мешает реализовать дерево в виде простой таблицы с доп. полем "уровень вложенности" и обрабатывать этот уровень так, как будет необходимо в XSLT преобразовании. Я, собственно, так и делал для древовидных данных (орг. структура HR, например).


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: XSLT преобразование вложенной структуры
СообщениеДобавлено: Ср, апр 02 2014, 11:41 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Пономарев Артем: Умеет-умеет, попробуйте преобразование id для вложенной структуры с generic type. На выходе получается то самое asXML представление параметра, которое и используется в XSLT представлении (в рантайме, не смотря на типизацию generic, тип все равно будет правильный)
Вот, например, представление этой самой структуры из примера в первом сообщении(только вместо PARAM здесь фигурирует ROW)
Code:
  <?xml version="1.0" encoding="utf-16" ?>
    <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<ROW>
  <NAME>Root</NAME>
  <DATE>2014-04-02</DATE>
  <RF_CHILD_LIST href="#d1" />
  </ROW>
  </asx:values>
<asx:heap xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:abap="http://www.sap.com/abapxml/types/built-in" xmlns:cls="http://www.sap.com/abapxml/classes/global" xmlns:dic="http://www.sap.com/abapxml/types/dictionary">
<prg:T_DEEP_STRUCT id="d1" xmlns:prg="http://www.sap.com/abapxml/types/program/ZEDU_TEST_XSLT_DEEP_TRANSFORM">
<item>
  <NAME>Child</NAME>
  <DATE>2014-04-22</DATE>
  <RF_CHILD_LIST />
  </item>
  </prg:T_DEEP_STRUCT>
  </asx:heap>
  </asx:abap>

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XSLT преобразование вложенной структуры
СообщениеДобавлено: Ср, апр 02 2014, 11:47 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Ок, не буду так категоричен, убедили. Может быть и умеет, но моих знаний тут не хватает тоже :) Если разберетесь - озвучьте решение. Задача практически полезная.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: XSLT преобразование вложенной структуры
СообщениеДобавлено: Ср, апр 02 2014, 12:53 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Изображение
Вот судя по тому, что вижу - все же как-то не особо умеет.

Цитата:
The optional element heap contains the contents of referenced anonymous data objects and objects.

Цитата:
Data objects references using stack references are not serialized.


Т.е. дальше asXML не идет. XSLT преобразование ваше ни сном ни духом о этих данных.

Подробности - тут.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: XSLT преобразование вложенной структуры
СообщениеДобавлено: Ср, апр 02 2014, 13:28 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Опять неправда ваша!
Полностью кусок из хелпа однако так выглядит:
Цитата:
Default for XSLT and only allowed there; data referenced using heap references is produced as subelements of the asXML elements <asx:heap>. Data objects references using stack references are not serialized.

И далее
Цитата:
Reference to an object or part of an object in the stack. A stack reference does not keep an object alive. See also heap reference.

и для сравнения
Цитата:
Reference to an object or part of an object in the heap. A heap reference keeps an object alive. See also stack reference.

Т.е.
1) по умолчанию для XSLT heap reference (меня вполне устраивает)
2) stack reference - ага, не сериализуется, но у меня-то п1!
Илия что-то неправильно прочитал в хелпе?
Честно скажу, я задачу решил несколько иначе(уже выше описал: просто передал нужные поля как отдельные параметры транфсофрмации), но для общего развития было бы интересно понять можно ли это сделать по-человечески.

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XSLT преобразование вложенной структуры
СообщениеДобавлено: Чт, апр 03 2014, 03:46 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
У меня подобное обрабатывается как-то так:

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

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

  <xsl:output encoding="UTF-8"/>

  <xsl:template match="/">
   
  <NAME>
    <xsl:value-of select="//PARAM/NAME"/>
  </NAME>
  <DATE>
    <xsl:value-of select="//PARAM/DATE"/>
  </DATE>

</xsl:template>

</xsl:transform>


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: XSLT преобразование вложенной структуры
СообщениеДобавлено: Чт, апр 03 2014, 09:53 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
AFH: Большое спасибо! Помогло!
А может быть Вы подскажете, как тогда и рекурсивно все дерево разобрать ? Т.е. в итоге, для данных из первого сообщения, надо получить вот такой XML

Code:
<NAME>
     Root
<NAME>
<DATE>
     2014-04-01
<DATE>
<NAME>
     Child
<NAME>
<DATE>
     2014-04-21
<DATE>


_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XSLT преобразование вложенной структуры
СообщениеДобавлено: Чт, апр 03 2014, 11:13 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
Если правильно понял вашу структуру, то что-то вроде

Code:
    <xsl:for-each select="PARAM">
      <xsl:call-template name="proc1"/>
    </xsl:for-each>

    <xsl:for-each select="item">
      <xsl:call-template name="proc1"/>
    </xsl:for-each>

<xsl:template name="proc1">
  <NAME>
    <xsl:value-of select="//NAME"/>
  </NAME>
  <DATE>
    <xsl:value-of select="//DATE"/>
  </DATE>
</xsl:template>



Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

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


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

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


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

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