SAPфорум.RU
https://sapboard.ru/forum/

Параметры в XSLT-мэппинге
https://sapboard.ru/forum/viewtopic.php?f=70&t=90811
Страница 1 из 1

Автор:  Chaser009 [ Пт, июн 26 2015, 10:15 ]
Заголовок сообщения:  Параметры в XSLT-мэппинге

Добрый день!

Не подскажете, как передать параметры из 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?

Автор:  chumpa [ Пт, июн 26 2015, 10:35 ]
Заголовок сообщения:  Re: Параметры в XSLT-мэппинге

засунуть параметры в DC а оттуда джава-расширением в XSLT.

Автор:  Chaser009 [ Пт, июн 26 2015, 10:48 ]
Заголовок сообщения:  Re: Параметры в XSLT-мэппинге

Ну я про это и писал. Изврат же. Делать отдельный мэппинг, чтобы просто до параметров достучаться.

Автор:  chumpa [ Пт, июн 26 2015, 13:11 ]
Заголовок сообщения:  Re: Параметры в XSLT-мэппинге

Ещё можно так -- первым сделать графический меппинг который из параметров положит в пейлоад, а потом уже XSLT.
Заодно в этом графическом прочие другие джава-преобразования делать.

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

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

Автор:  chumpa [ Пт, июн 26 2015, 13:13 ]
Заголовок сообщения:  Re: Параметры в XSLT-мэппинге

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


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

Автор:  Chaser009 [ Пн, июн 29 2015, 02:35 ]
Заголовок сообщения:  Re: Параметры в XSLT-мэппинге

:-) Я тоже часто выхватываю вопрос, пробегая наискосок предисловие.

Автор:  rabbit [ Пн, июн 29 2015, 13:21 ]
Заголовок сообщения:  Re: Параметры в XSLT-мэппинге

Мне тоже интересно было бы узнать другой способ передачи параметров в XSLT, кроме JAVA -> DC -> XSLT.

Автор:  chumpa [ Пн, июн 29 2015, 15:34 ]
Заголовок сообщения:  Re: Параметры в XSLT-мэппинге

можно способом, аналогичным подключению XSLT2-процессора, подцепить через "обёртку" которая на вход будет подавать параметры в xsl:param.

Автор:  jnw [ Вт, апр 18 2017, 15:12 ]
Заголовок сообщения:  Re: Параметры в XSLT-мэппинге

Добрый день!

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

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

Автор:  mona [ Чт, апр 20 2017, 13:46 ]
Заголовок сообщения:  Re: Параметры в XSLT-мэппинге

Добрый день!
Да, актуально.
Опишите, пожалуйста.

Автор:  jnw [ Пт, апр 28 2017, 17:29 ]
Заголовок сообщения:  Re: Параметры в XSLT-мэппинге  Тема решена

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 тоже не требуется.

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

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

Автор:  Chaser009 [ Чт, дек 21 2017, 11:43 ]
Заголовок сообщения:  Re: Параметры в XSLT-мэппинге

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 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/