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

Часовой пояс: 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 часа


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

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


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

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