Ranjith
Ranjith

Reputation: 21

output xml not showing in XSL

when I try to execute the input code its showing style sheet error by using xsl . As i am new to xslt , so any help would be highly appreciated. i need help in getting the below output from input.xml file

when I try to execute the input code its showing style sheet error by using xsl . As i am new to xslt , so any help would be highly appreciated.

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 COde XSL i tried to execute

<?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>

Expected Output 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>

Upvotes: 0

Views: 608

Answers (2)

Rudramuni TP
Rudramuni TP

Reputation: 1278

Some namespaces should declared in XML and XSLT side as shown below. Here namespaces are ns0, ns1, ns3.

In XML:

<mfgData xmlns:ns3="www.mynamespace1.com" xmlns:ns1="www.mynamespace1.com" xmlns:ns0="www.mynamespace1.com">

In 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">

Add Identity template:

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

Place like this in XSLT after <xsl:stylesheet ....

<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>

Upvotes: 1

michael.hor257k
michael.hor257k

Reputation: 116982

Your stylesheet has 5 named templates. There is no template that calls any of these templates - so none of them will be executed.

In addition, your stylesheet will error out because it uses prefixes without binding them to a namespace.

Also, your XML is missing a closing </serials> tag.

I am afraid there's not much else that can be said without knowing what you're trying to accomplish. Do note however, that your code could shortened significantly by using literal result elements instead of xsl:element.

Upvotes: 1

Related Questions