SAPфорум.RU https://sapboard.ru/forum/ |
|
Глюки процессора XSLT https://sapboard.ru/forum/viewtopic.php?f=70&t=90843 |
Страница 1 из 1 |
Автор: | Chaser009 [ Чт, июл 02 2015, 07:47 ] |
Заголовок сообщения: | Глюки процессора XSLT |
Коллеги, добрый день! Продолжается борьба с XSLT в PI Есть трансформация, где есть такой фрагмент: Code: <xsl:variable name="materialslist"> <xsl:for-each select="ns0:MT_NVT_Supply_Message/SalesDocument/Goods"> <Item> <xsl:value-of select="MaterialCode"/> </Item> </xsl:for-each> </xsl:variable> Переменная определяется в корневом контексте. Использую Stylus Studio, для сценария специально настроил использование саповского процессора из XMLToolkit (т.к. нужны параметры из OM). Command line: java com.sap.engine.lib.xsl.Process -xsl=%2 -xml=%1 -out=%3 Path: C:\JRE\jre6\bin Classpath: C:\JRE\sap.com~tc~sapxmltoolkit~sapxmltoolkit.jar Переменная понадобится дальше, пока для проверки вставил в шаблон: Code: <xsl:template match="/*"> <xsl:copy> <xsl:element name="Materials"> <xsl:value-of select="$materialslist"/> </xsl:element> <xsl:apply-templates select="*"/> </xsl:copy> </xsl:template> Запускаю на выполнение в Stylus Studio, все хорошо: <Materials>460389208675446038920867784603892086822</Materials> Переношу в ESR, запускаю OM с этим преобразованием, используя XMLToolkit, получаю: <Materials/> Отключаю XMLToolkit: <Materials>460389208675446038920867784603892086822</Materials> Библиотеку брал на сервере, где и тестирую: \\...\DVEBMGS09\j2ee\cluster\bin\ext\sapxmltoolkit\lib\ Вот что ему опять не нравится? |
Автор: | Chaser009 [ Чт, июл 02 2015, 09:05 ] |
Заголовок сообщения: | Re: Глюки процессора XSLT |
Пока искал решение проблемы, наткнулся на неизвестный мне до этого времени способ писать ява-мэппинг - прямо в графическом мэппинге. Прикольно, в простых случаях вполне себе подходит |
Автор: | chumpa [ Чт, июл 02 2015, 13:55 ] |
Заголовок сообщения: | Re: Глюки процессора XSLT |
пруф в студию! то есть минимальный пример XSLT и входного XML. |
Автор: | Chaser009 [ Чт, июл 02 2015, 14:03 ] |
Заголовок сообщения: | Re: Глюки процессора XSLT |
Пруф чего? Разных результатов? Завтра с утра сделаю, сейчас уже не на работе. |
Автор: | Chaser009 [ Чт, июл 02 2015, 14:11 ] |
Заголовок сообщения: | Re: Глюки процессора XSLT |
Да к тому же, сам факт, что явовский транслятор и XMLToolkit по-разному обрабатывают совершенно нехитрый шаблон, уже смущает |
Автор: | Chaser009 [ Пт, июл 03 2015, 03:49 ] |
Заголовок сообщения: | Re: Глюки процессора XSLT |
XSLT-преобразование: <?xml version='1.0'?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="http://www.novatour.ru"> <xsl:output indent="yes" method="xml" encoding="UTF-8" omit-xml-declaration="yes"/> <xsl:variable name="materialslist"> <xsl:for-each select="ns0:MT_NVT_Supply_Message/SalesDocument/Goods"> <Item> <xsl:value-of select="MaterialCode"/> </Item> </xsl:for-each> </xsl:variable> <xsl:template match="/*"> <xsl:copy> <xsl:element name="Materials"> <xsl:value-of select="$materialslist"/> </xsl:element> <xsl:apply-templates select="*"/> </xsl:copy> </xsl:template> <!--Copy document nodes--> <xsl:template match="*"> <xsl:copy> <xsl:apply-templates/> </xsl:copy> </xsl:template> <xsl:template match="Goods"> <xsl:copy> <xsl:attribute name="party_code"> <xsl:value-of select="MaterialCode"/> </xsl:attribute> <xsl:attribute name="party_plant"> <xsl:value-of select="Plant"/> </xsl:attribute> <xsl:apply-templates/> </xsl:copy> </xsl:template> <!--Get partner texts--> <xsl:template match="//Partner"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> <xsl:if test="Type='Consignee'"> <xsl:element name="PartnerTexts"> <xsl:call-template name="recusivetexts"> <xsl:with-param name="selnode" select="."/> </xsl:call-template> </xsl:element> </xsl:if> </xsl:copy> </xsl:template> <!--split Partner node contents into text lines with defined length and format option--> <xsl:template name="recusivetexts"> <xsl:param name="selnode"/> <xsl:for-each select="*"> <xsl:element name="TextLine"> <xsl:element name="Format">/*</xsl:element> <xsl:element name="Text"><xsl:value-of select="local-name()"/></xsl:element> </xsl:element> <xsl:if test="*"> <xsl:call-template name="recusivetexts"> <xsl:with-param name="selnode" select="."/> </xsl:call-template> </xsl:if> <xsl:if test="normalize-space(.) != ''"> <xsl:call-template name="splitstring"> <xsl:with-param name="str" select="normalize-space(.)"/> <xsl:with-param name="splitlength" select="130"/> </xsl:call-template> </xsl:if> <xsl:element name="TextLine"> <xsl:element name="Format">/*</xsl:element> <xsl:element name="Text"><xsl:value-of select="concat('/', local-name())"/></xsl:element> </xsl:element> </xsl:for-each> </xsl:template> <xsl:template name="splitstring"> <xsl:param name="str"/> <xsl:param name="splitlength"/> <xsl:choose> <xsl:when test="string-length($str) > $splitlength"> <xsl:element name="TextLine"> <xsl:element name="Format">/</xsl:element> <xsl:element name="Text"><xsl:value-of select="substring($str, 1, $splitlength)"/></xsl:element> </xsl:element> <xsl:variable name="newstr" select="substring($str, $splitlength+1)"/> <xsl:call-template name="splitstring"> <xsl:with-param name="str" select="$newstr"/> <xsl:with-param name="splitlength" select="$splitlength"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:element name="TextLine"> <xsl:element name="Format">/</xsl:element> <xsl:element name="Text"><xsl:value-of select="$str"/></xsl:element> </xsl:element> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> |
Автор: | Chaser009 [ Пт, июл 03 2015, 03:50 ] |
Заголовок сообщения: | Re: Глюки процессора XSLT |
Входной XML: <?xml version="1.0" encoding="UTF-8"?> <ns0:MT_NVT_Supply_Message xmlns:ns0="http://www.novatour.ru"> <MESSAGE_HEADER> <MESTYP>MT_NVT_Supply_Message</MESTYP> <MESID>00001140062015</MESID> <MESDATE>20150702</MESDATE> <SNDPRN>NOVATOUR</SNDPRN> <RCVPRN>VLL</RCVPRN> </MESSAGE_HEADER> <SalesDocument> <OrderNumber>Пе002177</OrderNumber> <DeliveryNumber>000114006</DeliveryNumber> <Partner> <Type>Supplier</Type> <Code>NOVATOUR</Code> </Partner> <Partner> <Type>Consignee</Type> <Code>03443</Code> <Name>Эм Дю Хок</Name> <Address>693000, Сахалинская обл, Южно-Сахалинск г, Мира пр, дом № 19 магазин «Рыболов-Элит»</Address> <ContactInfo> <PhoneNumber>(4242) 50-57-41</PhoneNumber> <EMail/> <ContactPerson> <Phone>(4242) 50-57-41</Phone> <Person/> </ContactPerson> </ContactInfo> <AdditionalInfo/> </Partner> <Partner> <Type>Forwarder</Type> <Code/> <Name>Протек Лоджистик (Уссурийск)</Name> <Address>г.Уссурийск, ул.Чичерина, д.152</Address> <ContactInfo> <PhoneNumber>8-4234-355-500</PhoneNumber> <EMail/> </ContactInfo> <AdditionalInfo/> </Partner> <DeliveryDate>06.07.2015</DeliveryDate> <OrderDate>02.07.2015</OrderDate> <AdditionalInfo/> <DeliveryToDoor/> <Goods> <MaterialCode>4603892086693</MaterialCode> <MaterialName>Лимерик 3 v.2 палатка</MaterialName> <MaterialCharactristics>Зеленый</MaterialCharactristics> <BaseUOM>шт</BaseUOM> <Quantity>5</Quantity> <Plant>00026</Plant> </Goods> <Goods> <MaterialCode>4603892086709</MaterialCode> <MaterialName>Лимерик 4 v.2 палатка</MaterialName> <MaterialCharactristics>Зеленый</MaterialCharactristics> <BaseUOM>шт</BaseUOM> <Quantity>5</Quantity> <Plant>00026</Plant> </Goods> </SalesDocument> </ns0:MT_NVT_Supply_Message> |
Автор: | chumpa [ Пт, июл 03 2015, 13:36 ] |
Заголовок сообщения: | Re: Глюки процессора XSLT |
$materialslist ты формируешь как дерево а используешь оттуда тексты, без Item -- зачем? Вместо <xsl:template match="/"....> проще так: <xsl:template match="/ns0:MT_NVT_Supply_Message"> <xsl:copy> <Materials><xsl:apply-templates mode="m1" select="SalesDocument/Goods/MaterialCode"></xsl:apply-templates></Materials> <xsl:apply-templates select="*"/> </xsl:copy> </xsl:template> Или если хочешь через переменную то <xsl:template match="/ns0:MT_NVT_Supply_Message"> <xsl:copy> <Materials><xsl:copy-of select="$materialslist"/></Materials> <xsl:apply-templates select="*"/> </xsl:copy> </xsl:template> |
Автор: | Chaser009 [ Пт, июл 03 2015, 14:13 ] |
Заголовок сообщения: | Re: Глюки процессора XSLT |
Насчет переменной уже писал выше - это просто для проверки правильности заполнения. Использоваться она будет позже, еще не реализовал. Но сам факт: при включенном xmltoolkit текст не выводится. Я уже переписал без использования toolkit. Почему-то был уверен, что без него параметры не выдерну из DC. Но все получилось. |
Автор: | chumpa [ Пт, июл 03 2015, 14:14 ] |
Заголовок сообщения: | Re: Глюки процессора XSLT |
а почему бы не <xsl:variable name="materialslist"> <xsl:for-each select="/ns0:MT_NVT_Supply_Message/SalesDocument/Goods"> <Item> <xsl:value-of select="MaterialCode"/> </Item> </xsl:for-each> </xsl:variable> ? Или у тебя этот код будет ещё в мультимеппинге? |
Автор: | Chaser009 [ Пт, июл 03 2015, 14:26 ] |
Заголовок сообщения: | Re: Глюки процессора XSLT |
А у меня вроде же так и есть? |
Автор: | chumpa [ Пт, июл 03 2015, 15:20 ] |
Заголовок сообщения: | Re: Глюки процессора XSLT |
у тебя без слеша первого |
Автор: | Chaser009 [ Пт, июл 03 2015, 17:18 ] |
Заголовок сообщения: | Re: Глюки процессора XSLT |
А, понятно. |
Автор: | Chaser009 [ Сб, июл 04 2015, 07:05 ] |
Заголовок сообщения: | Re: Глюки процессора XSLT |
Нет, мультимэппинга не будет. Да, согласен, так оптимальнее. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |