Reputation: 21
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
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
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