Текущее время: Чт, мар 28 2024, 13:53

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




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Параметры в XSLT-мэппинге
СообщениеДобавлено: Пт, июн 26 2015, 10:15 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 29 2011, 08:54
Сообщения: 318
Откуда: Владивосток, Россия
Пол: Мужской
Добрый день!

Не подскажете, как передать параметры из Operation Mapping в XSLT-преобразование? А то понадобилось вот, а простого решения найти не могу.
Вроде есть способ через java-маппинг закинуть в DynamicConfiguration, а потом оттуда уже считать в XSLT, но это такие костыли... SAP у себя из версии в версию вроде пишет, что можно, но стыдливо умалчивает, как.

When the XSLT mapping program is implemented, you access the mapping program parameters by accessing the get and set methods of the Java mapping API in the XSLT program (see also: XSLT Mapping with Java Enhancement, Parameterized Java Mappings).

Вот что они имеют в виду - непонятно. Или они про параметры в DynamicConfiguration пишут?

Выше вот это:

You define the XSLT mapping parameters for a XSLT mapping program when you create the binding, and at the same time connect them to operation mapping parameters. When you access the XSLT mapping parameters in the XSLT mapping program, the mapping runtime checks whether you have defined the parameters in the ES Repository. If not, an exception is raised.

Есть решения, кроме java-мэппинга перед XSLT?

_________________
У меня два правила:
1. Не говорить всего, что знаю.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параметры в XSLT-мэппинге
СообщениеДобавлено: Пт, июн 26 2015, 10:35 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 17:44
Сообщения: 1001
Откуда: что и все
Пол: Мужской
засунуть параметры в DC а оттуда джава-расширением в XSLT.

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параметры в XSLT-мэппинге
СообщениеДобавлено: Пт, июн 26 2015, 10:48 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 29 2011, 08:54
Сообщения: 318
Откуда: Владивосток, Россия
Пол: Мужской
Ну я про это и писал. Изврат же. Делать отдельный мэппинг, чтобы просто до параметров достучаться.

_________________
У меня два правила:
1. Не говорить всего, что знаю.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параметры в XSLT-мэппинге
СообщениеДобавлено: Пт, июн 26 2015, 13:11 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 17:44
Сообщения: 1001
Откуда: что и все
Пол: Мужской
Ещё можно так -- первым сделать графический меппинг который из параметров положит в пейлоад, а потом уже XSLT.
Заодно в этом графическом прочие другие джава-преобразования делать.

Я пытался через java-xslt расширения достучаться до параметров ОМ без костылей, вроде не получилось.

а так согласен, позор САПу, при наличии всех штатных (xsl:param и прочего) способов заставлять всех мучиться.

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параметры в XSLT-мэппинге
СообщениеДобавлено: Пт, июн 26 2015, 13:13 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 17:44
Сообщения: 1001
Откуда: что и все
Пол: Мужской
Chaser009 написал:
Есть решения, кроме java-мэппинга перед XSLT?


Ну я слоупок :cry:

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параметры в XSLT-мэппинге
СообщениеДобавлено: Пн, июн 29 2015, 02:35 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 29 2011, 08:54
Сообщения: 318
Откуда: Владивосток, Россия
Пол: Мужской
:-) Я тоже часто выхватываю вопрос, пробегая наискосок предисловие.

_________________
У меня два правила:
1. Не говорить всего, что знаю.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параметры в XSLT-мэппинге
СообщениеДобавлено: Пн, июн 29 2015, 13:21 
Ассистент
Ассистент

Зарегистрирован:
Пн, окт 20 2014, 10:13
Сообщения: 47
Мне тоже интересно было бы узнать другой способ передачи параметров в XSLT, кроме JAVA -> DC -> XSLT.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параметры в XSLT-мэппинге
СообщениеДобавлено: Пн, июн 29 2015, 15:34 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 17:44
Сообщения: 1001
Откуда: что и все
Пол: Мужской
можно способом, аналогичным подключению XSLT2-процессора, подцепить через "обёртку" которая на вход будет подавать параметры в xsl:param.

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параметры в XSLT-мэппинге
СообщениеДобавлено: Вт, апр 18 2017, 15:12 
Начинающий
Начинающий

Зарегистрирован:
Чт, апр 28 2011, 17:47
Сообщения: 13
Добрый день!

Господа, заранее прошу прощения, что поднимаю древнюю тему.
User-defined параметр в XSLT-маппинг передать МОЖНО. Без второго маппинга на Java и промежуточного хранения в DynConf, без оберток и т. п. Просто параметр в XSLT. Если тема все еще актуальна, готов рассказать подробно.
PO 7.4 Single Stack SP15.

Заранее спасибо.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параметры в XSLT-мэппинге
СообщениеДобавлено: Чт, апр 20 2017, 13:46 
Начинающий
Начинающий
Аватара пользователя

Зарегистрирован:
Ср, апр 24 2013, 22:41
Сообщения: 3
Откуда: Москва
Пол: Женский
Добрый день!
Да, актуально.
Опишите, пожалуйста.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параметры в XSLT-мэппинге  Тема решена
СообщениеДобавлено: Пт, апр 28 2017, 17:29 
Начинающий
Начинающий

Зарегистрирован:
Чт, апр 28 2011, 17:47
Сообщения: 13
mona написала:
Добрый день!
Да, актуально.
Опишите, пожалуйста.


Для начала, надо четко понимать, что формированием всех(!) параметров для XSLT и JAVA-маппингов в PI Java занимается один и тот же метод класса AbstractMappingTransformer. Следовательно, отсутствие user-defined параметра в XSLT - это просто недоработка, а никак не концептуальное ограничение.
В Java-маппинге за получение параметров отвечает класс com.sap.aii.mapping.api.TransformationInput. Точнее сказать, это не класс, а интерфейс, который реализуется внутрисистемным классом. Но не в этом суть. В XSLT-маппинге - ровным счетом то же самое. Чтобы добраться в маппинге до экземпляра TransformationInput, надо задать xslt-параметр:

Code:
<xsl:param name="TransformationInput" />

Собственно, на этом все. Теперь из него можно различными путями достать значение user-defined параметра по его имени. В моем случае оказалось удобнее использовать простейший Java класс-утилиту:

Code:
package xxx.xxx;

import com.sap.aii.mapping.api.InputParameters;
import com.sap.aii.mapping.api.TransformationInput;

public class Utils {
   
   public static String getSimpleMappingParameter( final Object transinput, final String paramName) {
      
      String strReturn = "";
      TransformationInput ti = (TransformationInput)transinput;
      
      if(ti != null) {
         InputParameters ip = ti.getInputParameters();
         if(ip != null) {
            Object value = ip.getValue(paramName);
            if(value != null) {
               strReturn = value.toString();
            }
         }
      }
      return strReturn;
   }
}


просто так получилось, что для этой интеграции уже была написана такая утилита и речь шла просто о добавлении в нее еще одного метода getSimpleMappingParameter.
Соответственно, не забываем в XSLT добавить в xsl:stylesheet конструкцию вида
Code:
xmlns:utils="xxx.xxx.Utils"
и убрать лишнее при помощи
Code:
exclude-result-prefixes="utils"

А дальше в маппинге все это можно использовать, например, как-то так:

Code:
<xsl:variable name="posme-param" select="utils:getSimpleMappingParameter($TransformationInput,'POSME')"/>


При создании Operation Mapping'а добавляем параметр POSME с общий список, а затем биндим его к XSLT-маппингу. Ну и не забываем задать его значение в Integration Directory.

Думаю, что также можно решить задачу тем же самым методом, которым используется DynConf в XSLT, приведя сначала полученный параметр TransformationInput к типу com.sap.aii.mapping.api.TransformationInput, затем вызвав на нем метод получения коллекции параметров, а уже из нее - метод получения параметра по имени. Получится страшно выглядящая xslt-конструкция, зато без лишнего самописного Java-класса. Как-то так:

Code:
<xsl:variable name="posme-param" select="inpar:getValue(transin:getInputParameters(xsltc:cast('com.sap.aii.mapping.api.TransformationInput',$TransformationInput)),'POSME')" />


Не забываем также "объявить" в xsl:stylesheet :
Code:
xmlns:xsltc="http://xml.apache.org/xalan/xsltc"
xmlns:transin="com.sap.aii.mapping.api.TransformationInput"
xmlns:inpar="com.sap.aii.mapping.api.InputParameters"


ну и убрать лишнее при помощи
Code:
exclude-result-prefixes="xsltc transin inpar"


К сожалению, совсем без Java никак. Но и никаких промежуточных маппингов с засовыванием результата в DynConf тоже не требуется.

Как видно, все - проще некуда :)

Надеюсь, кому-нибудь пригодится...


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параметры в XSLT-мэппинге
СообщениеДобавлено: Чт, дек 21 2017, 11:43 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 29 2011, 08:54
Сообщения: 318
Откуда: Владивосток, Россия
Пол: Мужской
jnw написал(а):
mona написала:
Добрый день!
Да, актуально.
Опишите, пожалуйста.


Для начала, надо четко понимать, что формированием всех(!) параметров для XSLT и JAVA-маппингов в PI Java занимается один и тот же метод класса AbstractMappingTransformer. Следовательно, отсутствие user-defined параметра в XSLT - это просто недоработка, а никак не концептуальное ограничение.
В Java-маппинге за получение параметров отвечает класс com.sap.aii.mapping.api.TransformationInput. Точнее сказать, это не класс, а интерфейс, который реализуется внутрисистемным классом. Но не в этом суть. В XSLT-маппинге - ровным счетом то же самое. Чтобы добраться в маппинге до экземпляра TransformationInput, надо задать xslt-параметр:

Code:
<xsl:param name="TransformationInput" />

Собственно, на этом все. Теперь из него можно различными путями достать значение user-defined параметра по его имени. В моем случае оказалось удобнее использовать простейший Java класс-утилиту:

Code:
package xxx.xxx;

import com.sap.aii.mapping.api.InputParameters;
import com.sap.aii.mapping.api.TransformationInput;

public class Utils {
   
   public static String getSimpleMappingParameter( final Object transinput, final String paramName) {
      
      String strReturn = "";
      TransformationInput ti = (TransformationInput)transinput;
      
      if(ti != null) {
         InputParameters ip = ti.getInputParameters();
         if(ip != null) {
            Object value = ip.getValue(paramName);
            if(value != null) {
               strReturn = value.toString();
            }
         }
      }
      return strReturn;
   }
}


просто так получилось, что для этой интеграции уже была написана такая утилита и речь шла просто о добавлении в нее еще одного метода getSimpleMappingParameter.
Соответственно, не забываем в XSLT добавить в xsl:stylesheet конструкцию вида
Code:
xmlns:utils="xxx.xxx.Utils"
и убрать лишнее при помощи
Code:
exclude-result-prefixes="utils"

А дальше в маппинге все это можно использовать, например, как-то так:

Code:
<xsl:variable name="posme-param" select="utils:getSimpleMappingParameter($TransformationInput,'POSME')"/>


При создании Operation Mapping'а добавляем параметр POSME с общий список, а затем биндим его к XSLT-маппингу. Ну и не забываем задать его значение в Integration Directory.

Думаю, что также можно решить задачу тем же самым методом, которым используется DynConf в XSLT, приведя сначала полученный параметр TransformationInput к типу com.sap.aii.mapping.api.TransformationInput, затем вызвав на нем метод получения коллекции параметров, а уже из нее - метод получения параметра по имени. Получится страшно выглядящая xslt-конструкция, зато без лишнего самописного Java-класса. Как-то так:

Code:
<xsl:variable name="posme-param" select="inpar:getValue(transin:getInputParameters(xsltc:cast('com.sap.aii.mapping.api.TransformationInput',$TransformationInput)),'POSME')" />


Не забываем также "объявить" в xsl:stylesheet :
Code:
xmlns:xsltc="http://xml.apache.org/xalan/xsltc"
xmlns:transin="com.sap.aii.mapping.api.TransformationInput"
xmlns:inpar="com.sap.aii.mapping.api.InputParameters"


ну и убрать лишнее при помощи
Code:
exclude-result-prefixes="xsltc transin inpar"


К сожалению, совсем без Java никак. Но и никаких промежуточных маппингов с засовыванием результата в DynConf тоже не требуется.

Как видно, все - проще некуда :)

Надеюсь, кому-нибудь пригодится...


Спасибо большое за подсказку! Предложенный вариант действительно работает.
Пример получения значения параметра "MyParam":

Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:ti="java:com.sap.aii.mapping.api.TransformationInput"
                xmlns:inpar="com.sap.aii.mapping.api.InputParameters"
                xmlns:xsltc="http://xml.apache.org/xalan/xsltc"
                exclude-result-prefixes="xs ti inpar xsltc"
    version="1.0">
   
    <xsl:param name="TransformationInput"/>
   
    <xsl:template match="/">
        <xsl:variable name="myparam" select="inpar:getValue(ti:getInputParameters(xsltc:cast('com.sap.aii.mapping.api.TransformationInput',$TransformationInput)),'MyParam')" />
        <Message>
            <Param><xsl:value-of select="$myparam"/></Param>
        </Message>
    </xsl:template>
</xsl:stylesheet>

_________________
У меня два правила:
1. Не говорить всего, что знаю.


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

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


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

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


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

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