2017-02-16 43 views
0

Я пытаюсь разобрать входящий XML-файл в структуру SAP с помощью XSLT. Я прочитал много уроков об этом и попробовал много вещей, чтобы заставить его работать, но что-то не совсем подходит.Специальные характеристики для XSLT в ABAP/SAP?

Мой ввода-XML (сокращенный пример):

Этот XML-файл не появляется, чтобы иметь какой-либо информации о стиле, связанный с ним. Дерево документов показано ниже.

<result> 
<row> 
<idSite>1</idSite> 
<idVisit>5814001</idVisit> 
<visitIp>62.225.0.0</visitIp> 
<visitorId>8765462c24df752f</visitorId> 
<actionDetails> 
<row> 
<type>action</type> 
<url> 
http://localhost/is-bin/INTERSHOP.enfinity/WFS/1401-B1-Site 
</url> 
<pageTitle> 
XXX 
</pageTitle> 
<pageIdAction>6817739</pageIdAction> 
<serverTimePretty>Feb 16, 2017 08:15:19</serverTimePretty> 
<pageId>48157003</pageId> 
<generationTime>41.13s</generationTime> 
<timeSpent>972</timeSpent> 
<timeSpentPretty>16 min 12s</timeSpentPretty> 
<icon/> 
<timestamp>1487232919</timestamp> 
</row> 
<row> 
<type>search</type> 
<url/> 
<pageIdAction/> 
<serverTimePretty>Feb 16, 2017 08:31:31</serverTimePretty> 
<pageId>48176219</pageId> 
<siteSearchKeyword>sc</siteSearchKeyword> 
<generationTime>9.21s</generationTime> 
<timeSpent>58</timeSpent> 
<timeSpentPretty>58s</timeSpentPretty> 
<icon>plugins/Morpheus/images/search_ico.png</icon> 
<timestamp>1487233891</timestamp> 
</row> 
<row> 
<type>search</type> 
<url/> 
<pageIdAction/> 
<serverTimePretty>Feb 16, 2017 08:32:29</serverTimePretty> 
<pageId>48177539</pageId> 
<siteSearchKeyword>sc</siteSearchKeyword> 
<generationTime>3.31s</generationTime> 
<timeSpent>137</timeSpent> 
<timeSpentPretty>2 min 17s</timeSpentPretty> 
<icon>plugins/Morpheus/images/search_ico.png</icon> 
<timestamp>1487233949</timestamp> 
</row> 
<row> 
<type>search</type> 
<url/> 
<pageIdAction/> 
<serverTimePretty>Feb 16, 2017 08:34:46</serverTimePretty> 
<pageId>48180485</pageId> 
<siteSearchKeyword>sc</siteSearchKeyword> 
<generationTime>3.33s</generationTime> 
<timeSpent>34</timeSpent> 
<timeSpentPretty>34s</timeSpentPretty> 
<icon>plugins/Morpheus/images/search_ico.png</icon> 
<timestamp>1487234086</timestamp> 
</row> 
<row> 
<type>action</type> 
<url> 
http://localhost/is-bin/INTERSHOP.enfinity/WFS/1401-B1-Site 
</url> 
<pageTitle> 
YYY 
</pageTitle> 
<pageIdAction>6817739</pageIdAction> 
<serverTimePretty>Feb 16, 2017 08:35:20</serverTimePretty> 
<pageId>48181187</pageId> 
<generationTime>37.19s</generationTime> 
<timeSpent>10</timeSpent> 
<timeSpentPretty>10s</timeSpentPretty> 
<icon/> 
<timestamp>1487234120</timestamp> 
</row> 
<row> 
<type>search</type> 
<url/> 
<pageIdAction/> 
<serverTimePretty>Feb 16, 2017 08:35:30</serverTimePretty> 
<pageId>48181399</pageId> 
<siteSearchKeyword>schlauch</siteSearchKeyword> 
<generationTime>3.03s</generationTime> 
<timeSpent>157</timeSpent> 
<timeSpentPretty>2 min 37s</timeSpentPretty> 
<icon>plugins/Morpheus/images/search_ico.png</icon> 
<timestamp>1487234130</timestamp> 
</row> 
<row> 
<type>search</type> 
<url/> 
<pageIdAction/> 
<serverTimePretty>Feb 16, 2017 08:38:07</serverTimePretty> 
<pageId>48184883</pageId> 
<siteSearchKeyword>schlauch</siteSearchKeyword> 
<generationTime>2.69s</generationTime> 
<timeSpent>118</timeSpent> 
<timeSpentPretty>1 min 58s</timeSpentPretty> 
<icon>plugins/Morpheus/images/search_ico.png</icon> 
<timestamp>1487234287</timestamp> 
</row> 
<row> 
<type>search</type> 
<url/> 
<pageIdAction/> 
<serverTimePretty>Feb 16, 2017 08:40:05</serverTimePretty> 
<pageId>48187525</pageId> 
<siteSearchKeyword>schlauch</siteSearchKeyword> 
<generationTime>2.83s</generationTime> 
<timeSpent>267</timeSpent> 
<timeSpentPretty>4 min 27s</timeSpentPretty> 
<icon>plugins/Morpheus/images/search_ico.png</icon> 
<timestamp>1487234405</timestamp> 
</row> 
</actionDetails> 
<goalConversions>2</goalConversions> 
<siteCurrency>EUR</siteCurrency> 
<siteCurrencySymbol>€</siteCurrencySymbol> 
<serverDate>2017-02-16</serverDate> 
<visitServerHour>8</visitServerHour> 
<lastActionTimestamp>1487233709</lastActionTimestamp> 
<lastActionDateTime>2017-02-16 08:28:29</lastActionDateTime> 
<userId>600000|600001</userId> 
<visitorType>returning</visitorType> 
<visitorTypeIcon>plugins/Live/images/returningVisitor.gif</visitorTypeIcon> 
<visitConverted>1</visitConverted> 
<visitConvertedIcon>plugins/Morpheus/images/goal.png</visitConvertedIcon> 
<visitCount>2</visitCount> 
<firstActionTimestamp>1487229319</firstActionTimestamp> 
<visitEcommerceStatus>abandonedCart</visitEcommerceStatus> 
<visitEcommerceStatusIcon>plugins/Morpheus/images/ecommerceAbandonedCart.gif</visitEcommerceStatusIcon> 
<daysSinceFirstVisit>1</daysSinceFirstVisit> 
<daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder> 
<visitDuration>4391</visitDuration> 
<visitDurationPretty>1 hours 13 min</visitDurationPretty> 
<searches>13</searches> 
<actions>28</actions> 
<referrerType>website</referrerType> 
<referrerTypeName>Websites</referrerTypeName> 
<referrerKeyword/> 
<referrerKeywordPosition/> 
<referrerSearchEngineUrl/> 
<referrerSearchEngineIcon/> 
<languageCode>de-de</languageCode> 
<language>Language code de-de</language> 
<deviceType>Desktop</deviceType> 
<deviceTypeIcon>plugins/DevicesDetection/images/screens/normal.gif</deviceTypeIcon> 
<deviceBrand>Unknown</deviceBrand> 
<deviceModel/> 
<operatingSystem>Windows 7</operatingSystem> 
<operatingSystemName>Windows</operatingSystemName> 
<operatingSystemIcon>plugins/DevicesDetection/images/os/WIN.gif</operatingSystemIcon> 
<operatingSystemCode>WIN</operatingSystemCode> 
<operatingSystemVersion>7</operatingSystemVersion> 
<browserFamily>Blink</browserFamily> 
<browserFamilyDescription>Blink (Chrome, Opera)</browserFamilyDescription> 
<browser>Chrome 56.0</browser> 
<browserName>Chrome</browserName> 
<browserIcon>plugins/DevicesDetection/images/browsers/CH.gif</browserIcon> 
<browserCode>CH</browserCode> 
<browserVersion>56.0</browserVersion> 
<events>0</events> 
<continent>Europe</continent> 
<continentCode>eur</continentCode> 
<country>Germany</country> 
<visitLocalTime>08:15:19</visitLocalTime> 
<visitLocalHour>8</visitLocalHour> 
<daysSinceLastVisit>0</daysSinceLastVisit> 
<customVariables> 
<row> 
<customVariableName1>saleschannel</customVariableName1> 
<customVariableValue1>SV</customVariableValue1> 
</row> 
<row> 
<customVariableName2>xxx</customVariableName2> 
<customVariableValue2>xxx</customVariableValue2> 
</row> 
<row> 
<customVariableName3>marketsegment</customVariableName3> 
<customVariableValue3>0018</customVariableValue3> 
</row> 
<row> 
<customVariableName4>login</customVariableName4> 
<customVariableValue4>standard</customVariableValue4> 
</row> 
</customVariables> 
<resolution>1920x1095</resolution> 
<plugins>pdf, flash</plugins> 
<pluginsIcons> 
<row> 
<pluginIcon>plugins/DevicePlugins/images/plugins/pdf.gif</pluginIcon> 
<pluginName>pdf</pluginName> 
</row> 
<row> 
<pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon> 
<pluginName>flash</pluginName> 
</row> 
</pluginsIcons> 
<serverTimestamp>1487233709</serverTimestamp> 
<serverTimePretty>09:28:29</serverTimePretty> 
<serverDatePretty>Thursday, February 16, 2017</serverDatePretty> 
<serverDatePrettyFirstAction>Thursday, February 16, 2017</serverDatePrettyFirstAction> 
<serverTimePrettyFirstAction>08:15:19</serverTimePrettyFirstAction> 
</row> 
</result> 

Мой XSLT (также сокращен, но он показывает сбой часть):

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl"> 
     <xsl:output encoding="iso-8859-1" indent="yes" method="xml" version="1.0"/> 
<xsl:template match="/"> 
     <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> 
     <asx:values> 
      <RESULT> 
      <xsl:for-each select="result/row"> 
       <VISIT> 
       <xsl:variable name="check1" select="name()"/> 
       <SERVERDATE>   <xsl:value-of select="serverDate"/>   </SERVERDATE> 
       <USERID>    <xsl:value-of select="userId"/>    </USERID> 
       <VISITORTYPE>   <xsl:value-of select="visitorType"/>   </VISITORTYPE> 
       <VISITECOMMERCESTATUS> <xsl:value-of select="visitECommerceOrder"/> </VISITECOMMERCESTATUS> 
       <DAYSSINCEFIRSTVISIT> <xsl:value-of select="daysSinceFirstVisit"/> </DAYSSINCEFIRSTVISIT> 
       <VISITDURATION>   <xsl:value-of select="visitDuration"/>  </VISITDURATION> 
       <SEARCHES>    <xsl:value-of select="searches"/>    </SEARCHES> 
       <ACTIONS>    <xsl:value-of select="actions"/>    </ACTIONS> 
       <REFERRERTYPE>   <xsl:value-of select="referrerType"/>   </REFERRERTYPE> 
       <REFERRERTYPENAME>  <xsl:value-of select="referrerTypeName"/>  </REFERRERTYPENAME> 
       <REFERRERNAME>   <xsl:value-of select="referrerName"/>   </REFERRERNAME> 
       <REFERRERKEYWORD>  <xsl:value-of select="referrerKeyword"/>  </REFERRERKEYWORD> 
       <DEVICETYPE>   <xsl:value-of select="deviceType"/>   </DEVICETYPE> 
       <xsl:for-each select="actionDetails/row"> 
        <xsl:variable name="row" select="current()" /> 
        <ACTIONDETAILS> 
        <TYPE>    <xsl:value-of select="$row/type"/>    </TYPE> 
        <URL>    <xsl:value-of select="$row/url"/>    </URL> 
        <GOALNAME>   <xsl:value-of select="$row/goalName"/>   </GOALNAME> 
        <GOALID>   <xsl:value-of select="$row/goalId"/>    </GOALID> 
        <SITESEARCHKEYWORD> <xsl:value-of select="$row/siteSearchKeyword"/> </SITESEARCHKEYWORD> 
        <ITEMS>    <xsl:value-of select="$row/items"/>    </ITEMS> 
        <xsl:for-each select="itemDetails/row"> 
         <ITEMDETAILS> 
         <ITEMSKU>  <xsl:value-of select="itemSKU"/></ITEMSKU> 
         <ITEMNAME>  <xsl:value-of select="itemName"/></ITEMNAME> 
         <ITEMCATEGORY> <xsl:value-of select="itemCategory"/></ITEMCATEGORY> 
         <PRICE>   <xsl:value-of select="price"/></PRICE> 
         <QUANTITY>  <xsl:value-of select="quantity"/></QUANTITY> 
         </ITEMDETAILS> 
        </xsl:for-each> 
        </ACTIONDETAILS> 
       </xsl:for-each> 
       <CUSTOMVARIABLES> 
        <xsl:for-each select="customVariables/row"> 
        <xsl:if test="contains(name(), '4')"> 
         <IDENTIFIER>   <xsl:text> 4 </xsl:text>      </IDENTIFIER> 
         <CUSTOMVARIABLENAME> <xsl:value-of select="customVariableName4"/> </CUSTOMVARIABLENAME> 
         <CUSTOMVARIABLEVALUE> <xsl:value-of select="customVariableValue4"/> </CUSTOMVARIABLEVALUE> 
        </xsl:if> 
        </xsl:for-each> 
       </CUSTOMVARIABLES> 
       <RESULT> <xsl:value-of select="result"/> </RESULT> 
       <MESSAGE> <xsl:value-of select="message"/> </MESSAGE> 
       </VISIT> 
      </xsl:for-each> 
      </RESULT> 
     </asx:values> 
     </asx:abap> 
    </xsl:template> 
    </xsl:transform> 

Кроме того, в случае, если это имеет значение, мое преобразование вызова:

CALL TRANSFORMATION zz_tf_xmlvisit 
     SOURCE XML myXml 
     RESULT result = myVisits. 

Теперь проблема: После того, как парсер переместится к первому элементу во втором для каждого цикла (в данном случае в «type»), он сработает, и отладчик выдает CX_XSLT_FORMAT_ERROR. Без отладки он просто говорит «Неожиданный текст для преобразования XML-ABAP».

Я очень полагаю, что существует определенная проблема с SAP с синтаксическим анализатором XSLT, о котором я не знаю. Если я подтвержу свое преобразование с помощью онлайн-валидатора, он работает нормально.

+0

Я не могу воспроизвести проблему здесь. Повторите проверку, чтобы убедиться, что вы случайно не вырезали данные или заявление, вызывающие проблему. – vwegert

+0

@vwegert Я добавил большой пример и весь код. Сначала мне пришлось исключить разумные данные. – Tassimmo

+0

В вашем редактировании вы, очевидно, потеряли первые две строки XSLT. Поскольку у меня нет вашей целевой структуры данных, я могу только дважды проверить использование тестового объекта в STRANS, и это, похоже, работает. Может быть, целевая структура данных несовместима с asXML, который вы генерируете? – vwegert

ответ

0

Понял:

... 
<DEVICETYPE>   <xsl:value-of select="deviceType"/>   </DEVICETYPE> 
      <ACTIONDETAILS> 
      <xsl:for-each select="actionDetails/row"> 
<!--    <xsl:variable name="row" select="current()" />--> 
       <ACTIONDETAIL> 
       <TYPE>    <xsl:value-of select="type"/>    </TYPE> 
       <URL>    <xsl:value-of select="url"/>    </URL> 
       <GOALNAME>   <xsl:value-of select="goalName"/>   </GOALNAME> 
       <GOALID>   <xsl:value-of select="goalId"/>    </GOALID> 
       <SITESEARCHKEYWORD> <xsl:value-of select="siteSearchKeyword"/> </SITESEARCHKEYWORD> 
       <ITEMS>    <xsl:value-of select="items"/>    </ITEMS> 
       <ITEMDETAILS> 
       <xsl:for-each select="itemDetails/row"> 
        <ITEMDETAIL> 
        <ITEMSKU>  <xsl:value-of select="itemSKU"/></ITEMSKU> 
        <ITEMNAME>  <xsl:value-of select="itemName"/></ITEMNAME> 
        <ITEMCATEGORY> <xsl:value-of select="itemCategory"/></ITEMCATEGORY> 
        <PRICE>   <xsl:value-of select="price"/></PRICE> 
        <QUANTITY>  <xsl:value-of select="quantity"/></QUANTITY> 
        </ITEMDETAIL> 
       </xsl:for-each> 
       </ITEMDETAILS> 
       </ACTIONDETAIL> 
      </xsl:for-each> 
      </ACTIONDETAILS> 
... 

Моя структура была действительно правильно: P
Я забыл добавить узел ACTIONDETAIL родительский S для моей коллекции ACTIONDETAIL. То почему он был в неправильном узле в конце концов ... Я не объясняю, почему он работал правильно в валидаторе, но по крайней мере сейчас он работает. Спасибо!

+0

Это объясняет это отлично, и это именно то, что я подозревал: вы создали то, что не было asXML-представлением цели состав. Валидатор не знает или не заботится о целевой структуре. – vwegert