выходной XML не отображается в XSL - PullRequest
0 голосов
/ 04 июля 2019

когда я пытаюсь выполнить входной код, он показывает ошибку таблицы стилей с помощью xsl. Как я новичок в xslt, поэтому любая помощь будет принята с благодарностью. Мне нужна помощь в получении приведенного ниже вывода из файла input.xml

когда я пытаюсь выполнить входной код, он показывает ошибку таблицы стилей с помощью xsl. Поскольку я новичок в xslt, любая помощь будет принята с благодарностью.

Input XML 
<mfgData>
 <serials>
  <serial>
   <palletSerial>123456</palletSerial>
   <masterSerial>123456789</masterSerial>
   <innerSerial>$</innerSerial>
   <serial>00001</serial>
   <Item>0-500290</Item>
   <fwVer>4.0.11</fwVer>
   <hwVer>S2</hwVer>
   <macId>1234567890ABCDEF</macId>
   <mfgDate>20181005</mfgDate>
   <deliveryId></deliveryId>
  </serial>
  <serial>
   <palletSerial>123456</palletSerial>
   <masterSerial>123456789</masterSerial>
   <innerSerial>$</innerSerial>
   <serial>00002</serial>
   <Item>00290</Item>
   <fwVer>4.0.11</fwVer>
   <hwVer>S2</hwVer>
   <macId>234567890ABCDEFG</macId>
   <mfgDate>20181005</mfgDate>
   <deliveryId></deliveryId>
  </serial>
</mfgData>

XSLT-код XSL я пытался выполнить

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

        <xsl:template name="SERIALSMAP">
    <xsl:param name="pRoot"/>
    <xsl:element name = 'ns0:Send'>
        <xsl:element name = 'ns0:idocData'>
            <xsl:element name = 'ns3:EDI_DC40'>
                <xsl:element name = 'ns1:TABNAM'>EDI_DC40</xsl:element>
                <xsl:element name = 'ns1:DIRECT'>2</xsl:element>
                <xsl:element name = 'ns1:DOCREL'>701</xsl:element>
                <xsl:element name = 'ns1:STATUS'></xsl:element>
                <xsl:element name = 'ns1:IDOCTYP'>ZDSC_SERIAL_PACK</xsl:element>
                <xsl:element name = 'ns1:CIMTYP'></xsl:element>
                <xsl:element name = 'ns1:MESTYP'>ZDSC_SERIAL</xsl:element>
    <xsl:choose>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) > 0" >
           <xsl:element name = 'ns1:MESCOD'>DLV</xsl:element>
         </xsl:when>
         <xsl:otherwise>
          <xsl:element name = 'ns1:MESCOD'>PAC</xsl:element>
         </xsl:otherwise>
       </xsl:choose>                
                <xsl:element name = 'ns1:MESFCT'></xsl:element>
                <xsl:element name = 'ns1:CREDAT'></xsl:element>
                <xsl:element name = 'ns1:CRETIM'></xsl:element>
                <xsl:element name = 'ns1:SNDPOR'></xsl:element>
                <xsl:element name = 'ns1:SNDPRT'></xsl:element>
                <xsl:element name = 'ns1:SNDPRN'></xsl:element>
                <xsl:element name = 'ns1:RCVPOR'></xsl:element>
                <xsl:element name = 'ns1:RCVPRT'></xsl:element>
                <xsl:element name = 'ns1:RCVPRN'></xsl:element>
                <xsl:element name = 'ns1:STD'></xsl:element>
                <xsl:element name = 'ns1:STDVRS'></xsl:element>
                <xsl:element name = 'ns1:STDMES'></xsl:element>
                <xsl:element name = 'ns1:SERIAL'></xsl:element>
            </xsl:element>
            <xsl:element name = 'ns3:ZDSC_SERIAL_DOC_HEAD000GRP'>
                <xsl:element name = 'ns3:ZDSC_SERIAL_DOC_HEAD000'>
                    <xsl:element name = 'ns3:EBELN'><xsl:text>$1</xsl:text>
                </xsl:element>
                <xsl:choose>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 1" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('000000000',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 2" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('00000000',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 3" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('0000000',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 4" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('000000',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 5" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('00000',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 6" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('0000',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 7" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('000',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 8" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('00',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 9" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('0',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 10" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="//SERIALS[2]/Delivery_ID/text()"/></xsl:element>
         </xsl:when>
         <xsl:otherwise>
          <xsl:element name = 'ns3:VBELN'><xsl:text>$1</xsl:text></xsl:element>
         </xsl:otherwise>
       </xsl:choose>
                </xsl:element>                              
                <!--xsl:for-each select=".//SERIALS[Pallet_Serial=preceding-sibling::SERIALS/Pallet_Serial]"-->
                <!--xsl:for-each select=".//SERIALS/Pallet_Serial"-->
                <xsl:for-each select=".//SERIALS[not(Pallet_Serial=preceding-sibling::SERIALS/Pallet_Serial)]"> 
                    <xsl:if test="position()!=1">
                        <xsl:call-template name="Pallets">
                            <xsl:with-param name="PalletiD">
                                <xsl:value-of select=".//Pallet_Serial/text()"/>
                            </xsl:with-param>
                        </xsl:call-template>
                    </xsl:if>
                </xsl:for-each>
            </xsl:element>
        </xsl:element>
    </xsl:element>
</xsl:template>
<xsl:template name="Pallets">
    <xsl:param name="PalletiD"/>
    <xsl:element name = 'ns3:ZDSC_SERIAL_PALLET000GRP'>
        <xsl:element name = 'ns3:ZDSC_SERIAL_PALLET000'>
            <xsl:element name = 'ns3:DATAHEADERCOLUMN_SEGNAM'>
                <xsl:text>ZDSC_SERIAL_PALLET000</xsl:text>
            </xsl:element>
            <xsl:element name = 'ns3:EXIDV'>
                <xsl:value-of select="$PalletiD"/>
            </xsl:element>
        </xsl:element>
        <xsl:for-each select="//SERIALS[(Pallet_Serial=$PalletiD) and not(Master_Serial=preceding-sibling::SERIALS/Master_Serial)]">
            <xsl:call-template name="Masters">
                <xsl:with-param name="MasterID">
                    <xsl:value-of select=".//Master_Serial/text()"/>
                </xsl:with-param>
            </xsl:call-template>
        </xsl:for-each>
    </xsl:element>
</xsl:template>
<xsl:template name="Masters">
    <xsl:param name="MasterID"/>
    <xsl:element name = 'ns3:ZDSC_SERIAL_MASTER000GRP'>
        <xsl:element name = 'ns3:ZDSC_SERIAL_MASTER000'>
            <xsl:element name = 'ns3:DATAHEADERCOLUMN_SEGNAM'>
                <xsl:text>ZDSC_SERIAL_MASTER000</xsl:text>
            </xsl:element>
            <xsl:element name = 'ns3:EXIDV'>
                <xsl:value-of select="$MasterID"/>
            </xsl:element>
        </xsl:element>

        <!--xsl:for-each select="//SERIALS[(Master_Serial=$MasterID) and not(Inner_Serial=preceding-sibling::SERIALS/Inner_Serial)]"-->
        <xsl:for-each select="//SERIALS[(Master_Serial=$MasterID) and not(Inner_Serial=preceding-sibling::SERIALS/Inner_Serial)]">  
            <xsl:variable name="InnerSerialID">
                <xsl:value-of select=".//Inner_Serial/text()"/>
            </xsl:variable>
            <xsl:choose>
                <xsl:when test="$InnerSerialID='$'">
                    <xsl:element name = 'ns3:ZDSC_SERIAL_INNER000GRP'>
                    <xsl:element name = 'ns3:ZDSC_SERIAL_INNER000'>
                        <xsl:element name = 'ns3:DATAHEADERCOLUMN_SEGNAM'>
                            <xsl:text>ZDSC_SERIAL_INNER000</xsl:text>
                        </xsl:element>
                        <xsl:element name = 'ns3:EXIDV'>
                            <xsl:value-of select="$InnerSerialID"/>
                        </xsl:element>
                    </xsl:element>
                        <xsl:for-each select="//SERIALS[(Inner_Serial=$InnerSerialID) and (Master_Serial=$MasterID)]">
                            <xsl:element name = 'ns3:ZDSC_SERIAL_DETAILS000'>
                                <xsl:element name = 'ns3:DATAHEADERCOLUMN_SEGNAM'>
                                    <xsl:text>ZDSC_SERIAL_DETAILS000</xsl:text>
                                </xsl:element>
                                <xsl:element name = 'ns3:MATNR'>
                                    <xsl:value-of select=".//Item/text()"/>
                                </xsl:element>
                                <xsl:element name = 'ns3:SERNR'>
                                    <xsl:value-of select=".//Serial/text()"/>
                                </xsl:element>
                                <xsl:element name = 'ns3:ZZ_HDW_VERSION'>
                                    <xsl:value-of select=".//FW_Ver/text()"/>
                                </xsl:element>
                                <xsl:element name = 'ns3:ZZ_SW_VERSION'>
                                    <xsl:value-of select=".//HW_Ver/text()"/>
                                </xsl:element>
                                <xsl:element name = 'ns3:ZZ_MAC_ADDRESS'>
                                    <xsl:value-of select=".//MAC_ID/text()"/>
                                </xsl:element>
                                <xsl:element name = 'ns3:ZZ_MANF_DATE'>
                                    <xsl:value-of select=".//Mfg_date/text()"/>
                                </xsl:element>
                            </xsl:element>
                        </xsl:for-each>
                    </xsl:element>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:call-template name="Inner">
                        <xsl:with-param name="InnerID">
                            <xsl:value-of select=".//Inner_Serial/text()"/>
                        </xsl:with-param>
                    </xsl:call-template>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </xsl:element>
</xsl:template>
<xsl:template name="Inner">
    <xsl:param name="InnerID"/>
    <xsl:element name = 'ns3:ZDSC_SERIAL_INNER000GRP'>
        <xsl:element name = 'ns3:ZDSC_SERIAL_INNER000'>
            <xsl:element name = 'ns3:DATAHEADERCOLUMN_SEGNAM'>
                <xsl:text>ZDSC_SERIAL_INNER000</xsl:text>
            </xsl:element>
            <xsl:element name = 'ns3:EXIDV'>
                <xsl:value-of select="$InnerID"/>
            </xsl:element>
        </xsl:element>
        <xsl:for-each select="//SERIALS[(Inner_Serial=$InnerID) and not(Inner_Serial=preceding-sibling::SERIALS/Inner_Serial)]">
            <xsl:call-template name="InnerSerial">
                <xsl:with-param name="InnerSerialID">
                    <xsl:value-of select=".//Inner_Serial/text()"/>
                </xsl:with-param>
            </xsl:call-template>
        </xsl:for-each>
    </xsl:element>
</xsl:template>
<xsl:template name="InnerSerial">
    <xsl:param name="InnerSerialID"/>
        <xsl:for-each select="//SERIALS[(Inner_Serial=$InnerSerialID)]">
            <xsl:element name = 'ns3:ZDSC_SERIAL_DETAILS000'>
                <xsl:element name = 'ns3:DATAHEADERCOLUMN_SEGNAM'>
                    <xsl:text>ZDSC_SERIAL_DETAILS000</xsl:text>
                </xsl:element>
                <xsl:element name = 'ns3:MATNR'>
                    <xsl:value-of select=".//Item/text()"/>
                </xsl:element>
                <xsl:element name = 'ns3:SERNR'>
                    <xsl:value-of select=".//Serial/text()"/>
                </xsl:element>
                <xsl:element name = 'ns3:ZZ_HDW_VERSION'>
                    <xsl:value-of select=".//FW_Ver/text()"/>
                </xsl:element>
                <xsl:element name = 'ns3:ZZ_SW_VERSION'>
                    <xsl:value-of select=".//HW_Ver/text()"/>
                </xsl:element>
                <xsl:element name = 'ns3:ZZ_MAC_ADDRESS'>
                    <xsl:value-of select=".//MAC_ID/text()"/>
                </xsl:element>
                <xsl:element name = 'ns3:ZZ_MANF_DATE'>
                    <xsl:value-of select=".//Mfg_date/text()"/>
                </xsl:element>
            </xsl:element>
        </xsl:for-each>
</xsl:template> 
</xsl:stylesheet>

Ожидаемый вывод XML

<?xml version="1.0" encoding="UTF-8"?>
<ZDSC_SERIAL_PACK>
   <IDOC BEGIN="">
      <EDI_DC40 SEGMENT="">
         <TABNAM>EDI_DC40</TABNAM>
         <MANDT>400</MANDT>
         <DOCNUM/>
         <DOCREL/>
         <STATUS/>
         <DIRECT/>
         <OUTMOD/>
         <EXPRSS/>
         <TEST/>
         <IDOCTYP>ZDSC_SERIAL_PACK</IDOCTYP>
         <CIMTYP/>
         <MESTYP>ZDSC_SERIAL</MESTYP>
         <MESCOD>VNT</MESCOD>
         <MESFCT/>
         <STD/>
         <STDVRS/>
         <STDMES/>
         <SNDPOR></SNDPOR>
         <SNDPRT></SNDPRT>
         <SNDPFC/>
         <SNDPRN></SNDPRN>
         <SNDSAD/>
         <SNDLAD/>
         <RCVPOR></RCVPOR>
         <RCVPRT>YY</RCVPRT>
         <RCVPFC>YY</RCVPFC>
         <RCVPRN>XXXX</RCVPRN>
         <RCVSAD/>
         <RCVLAD/>
         <CREDAT/>
         <CRETIM/>
         <REFINT/>
         <REFGRP/>
         <REFMES/>
         <ARCKEY/>
         <SERIAL/>
      </EDI_DC40>
      <ZDSC_SERIAL_DOC_HEAD SEGMENT="">
         <EBELN>$1</EBELN>
         <VBELN></VBELN>
         <ZDSC_SERIAL_PALLET SEGMENT="">
            <EXIDV>123456</EXIDV>
            <ZDSC_SERIAL_MASTER SEGMENT="">
               <EXIDV>123456789</EXIDV>
               <ZDSC_SERIAL_INNER SEGMENT="">
                  <EXIDV>$</EXIDV>
                  <ZDSC_SERIAL_DETAILS SEGMENT="">
                     <MATNR>500325</MATNR>
                     <SERNR>00001</SERNR>
                     <ZZ_HDW_VERSION>S2</ZZ_HDW_VERSION>
                     <ZZ_SW_VERSION>3400015513</ZZ_SW_VERSION>
                     <ZZ_MAC_ADDRESS>$</ZZ_MAC_ADDRESS>
                     <ZZ_MANF_DATE>20190208</ZZ_MANF_DATE>
                  </ZDSC_SERIAL_DETAILS>
                  <ZDSC_SERIAL_DETAILS SEGMENT="">
                     <MATNR>500325</MATNR>
                     <SERNR>00002</SERNR>
                     <ZZ_HDW_VERSION>1</ZZ_HDW_VERSION>
                     <ZZ_SW_VERSION>3400015513</ZZ_SW_VERSION>
                     <ZZ_MAC_ADDRESS>$</ZZ_MAC_ADDRESS>
                     <ZZ_MANF_DATE>20190208</ZZ_MANF_DATE>
                  </ZDSC_SERIAL_DETAILS>
               </ZDSC_SERIAL_INNER>
            </ZDSC_SERIAL_MASTER>
         </ZDSC_SERIAL_PALLET>
      </ZDSC_SERIAL_DOC_HEAD>
   </IDOC>
</ZDSC_SERIAL_PACK>

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Ваша таблица стилей имеет 5 именованных шаблонов.Нет шаблона, который бы вызывал любой из этих шаблонов, поэтому ни один из них не будет выполнен.

Кроме того, ваша таблица стилей выдаст ошибку, поскольку она использует префиксы без привязки их к пространству имен.

Кроме того, в вашем XML отсутствует закрывающий тег </serials>.

Боюсь, больше ничего не скажешь, не зная, чего ты пытаешься достичь.Однако обратите внимание, что ваш код может быть значительно сокращен при использовании буквальных элементов результата вместо xsl:element.

1 голос
/ 04 июля 2019

Некоторые пространства имен должны быть объявлены на стороне XML и XSLT, как показано ниже. Здесь пространства имен: ns0, ns1, ns3.

В XML:

В XSLT:

Добавить Идентичность шаблон:

<xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>

Поместите это в XSLT после

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns3="www.mynamespace1.com" xmlns:ns1="www.mynamespace1.com"  xmlns:ns0="www.mynamespace1.com">

<xsl:template match="@*|node()"><!--identity template -->
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
.
.<!--Rest of your code as is copy here-->
.
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...