<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:asp="remove">

    <xsl:output method="text" indent="yes"/>

    <xsl:param name="palletlabels"/>

    <xsl:param name="includeitem"/>

    <xsl:param name="despatchadvicetype"/>


    <xsl:template match="Document">

{

    "Header": {

        "Address": [{

            "AddressLocationNumber": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="Warehouse/Code"/>

                        </xsl:call-template>",

            "LocationCodeQualifier": "92",

            "Address1": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="Warehouse/Street1"/>

                        </xsl:call-template>",

            "Address2": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="Warehouse/Street2"/>

                        </xsl:call-template>",

            "AddressName": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="Warehouse/Name"/>

                        </xsl:call-template>",

            "AddressTypeCode": "SF",

            "City": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="Warehouse/Suburb"/>

                        </xsl:call-template>",

            "Country": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="Warehouse/Country"/>

                        </xsl:call-template>",

            "PostalCode": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="substring(concat('00000',Warehouse/PostCode), string-length(concat('00000',Warehouse/PostCode))-4,5)"/>

                        </xsl:call-template>",

            "State": "<xsl:call-template name="json-string">

                            <!--<xsl:with-param name="value" select="Warehouse/State"/>-->

                            <xsl:with-param name="value" select="substring(concat('  ',Warehouse/State), string-length(concat('  ',Warehouse/State))-1,2)"/>

                        </xsl:call-template>"

        },

        {

            "AddressLocationNumber": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="substring(concat('0000',Parties/PartyIdentifier[Type='SHIPTO']/Code), string-length(concat('0000',Parties/PartyIdentifier[Type='SHIPTO']/Code))-3,4)"/>

                        </xsl:call-template>",

            "LocationCodeQualifier": "92",

            "Address1": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="Parties/PartyIdentifier[Type='SHIPTO']/Street1"/>

                        </xsl:call-template>",

            "Address2": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="Parties/PartyIdentifier[Type='SHIPTO']/Street2"/>

                        </xsl:call-template>",

            "AddressName": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="Parties/PartyIdentifier[Type='SHIPTO']/Name"/>

                        </xsl:call-template>",

            "AddressTypeCode": "ST",

            "City": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="Parties/PartyIdentifier[Type='SHIPTO']/Suburb"/>

                        </xsl:call-template>",

            "Country": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="Parties/PartyIdentifier[Type='SHIPTO']/Country"/>

                        </xsl:call-template>",

            "PostalCode": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="substring(concat('00000',Parties/PartyIdentifier[Type='SHIPTO']/PostCode), string-length(concat('00000',Parties/PartyIdentifier[Type='SHIPTO']/PostCode))-4,5)"/>

                        </xsl:call-template>",

            "State": "<xsl:call-template name="json-string">

                            <!--<xsl:with-param name="value" select="Parties/PartyIdentifier[Type='SHIPTO']/State"/>-->

                            <xsl:with-param name="value" select="substring(concat('  ',Parties/PartyIdentifier[Type='SHIPTO']/State), string-length(concat('  ',Parties/PartyIdentifier[Type='SHIPTO']/State))-1,2)"/>

                        </xsl:call-template>"

        }],

        "BillOfLadingNumber": "<xsl:choose>

                            <xsl:when test="Invoices/Invoice[1]/ConNoteNumber != '' ">

                                <xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Invoices/Invoice[1]/ConNoteNumber"/>

                                </xsl:call-template>

                            </xsl:when>

                            <xsl:otherwise>

                                <xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Invoices/Invoice[1]/DeliveryNumber"/>

                                </xsl:call-template>

                            </xsl:otherwise>

                        </xsl:choose>",

        "CarrierInformation": [{

            "CarrierAlphaCode": "<xsl:choose>

                            <xsl:when test="Invoices/Invoice[0]/CarrierAlphaCode != '' ">

                                <xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Invoices/Invoice[0]/CarrierAlphaCode"/>

                                </xsl:call-template>

                            </xsl:when>

                            <xsl:otherwise>

                                <xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="SupplierFreightCompany/CarrierAlphaCode"/>

                                </xsl:call-template>

                            </xsl:otherwise>

                        </xsl:choose>",

            "CarrierRouting": "<xsl:choose>

                            <xsl:when test="Invoices/Invoice[0]/CarrierRouting != '' ">

                                <xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Invoices/Invoice[0]/CarrierRouting"/>

                                </xsl:call-template>

                            </xsl:when>

                            <xsl:otherwise>

                                <xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="SupplierFreightCompany/CarrierRouting"/>

                                </xsl:call-template>

                            </xsl:otherwise>

                        </xsl:choose>"

        }],

        "CarrierProNumber": "<xsl:choose>

                            <xsl:when test="Invoices/Invoice[1]/ConNoteNumber != '' ">

                                <xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Invoices/Invoice[1]/ConNoteNumber"/>

                                </xsl:call-template>

                            </xsl:when>

                            <xsl:otherwise>

                                <xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Invoices/Invoice[1]/DeliveryNumber"/>

                                </xsl:call-template>

                            </xsl:otherwise>

                        </xsl:choose>",

        "Department": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="Department"/>

                        </xsl:call-template>",

        "Division": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="Division"/>

                        </xsl:call-template>",

        "Notes": [{

            "Note": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="Comment"/>

                        </xsl:call-template>",

            "NoteCode": "SPE"

        }],

        "PurchaseOrderNumber": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="OrderNumber"/>

                        </xsl:call-template>",

        "TradingPartnerId": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="SenderID"/>

                        </xsl:call-template>",

        "Vendor": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="Supplier/CompanyGS1Number"/>

                        </xsl:call-template>",

        "References": [{

            "ReferenceID": "<xsl:call-template name="json-string">

                                <xsl:with-param name="value" select="''"/>

                            </xsl:call-template>",

            "ReferenceQual": "PHC"

        }]

    },

    "Pack": [

    <xsl:choose>

        <xsl:when test="palletlabels = 'true' ">

            <xsl:for-each select="Pallets/Pallet">

        {

        "Address": [{

            "AddressLocationNumber": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="StorePartyIdentifier/Code"/>

                        </xsl:call-template>",

            "AddressName": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="StorePartyIdentifier/Name"/>

                        </xsl:call-template>",

            "AddressTypeCode": "Z7",

            "LocationCodeQualifier": "92",

            "Address1": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="StorePartyIdentifier/Street1"/>

                        </xsl:call-template>",

            "Address2": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="StorePartyIdentifier/Street2"/>

                        </xsl:call-template>",

            "AddressName": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="StorePartyIdentifier/Name"/>

                        </xsl:call-template>",

            "City": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="StorePartyIdentifier/Suburb"/>

                        </xsl:call-template>",

            "Country": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="StorePartyIdentifier/Country"/>

                        </xsl:call-template>",

            "PostalCode": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="substring(concat('00000',StorePartyIdentifier/PostCode), string-length(concat('00000',StorePartyIdentifier/PostCode))-4,5)"/>

                        </xsl:call-template>",

            "State": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="StorePartyIdentifier/State"/>

                        </xsl:call-template>"

        }],

        "Item": [

                <xsl:for-each select="Cartons/Carton">

                    <xsl:for-each select="CartonQuantities/CartonQuantity">

        {

            "BuyerPartNumber": "<xsl:choose>

                            <xsl:when test="Line/RetailerItemCode != '' ">

                                <xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Line/RetailerItemCode"/>

                                </xsl:call-template>

                            </xsl:when>

                            <xsl:otherwise>

                                <xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Line/MatchedItemCode"/>

                                </xsl:call-template>

                            </xsl:otherwise>

                        </xsl:choose>",

            "ConsumerPackageCode": "<xsl:choose>

                            <xsl:when test="Line/ConsumerPackageCode != '' ">

                                <xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Line/ConsumerPackageCode"/>

                                </xsl:call-template>

                            </xsl:when>

                            <xsl:otherwise>

                                <xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Line/BarCode"/>

                                </xsl:call-template>

                            </xsl:otherwise>

                        </xsl:choose>",

            "Dates": [{

                "Date": "<xsl:call-template name="json-date">

                                <xsl:with-param name="value" select="BestBeforeDate"/>

                        </xsl:call-template>",

                "DateTimeQualifier": "036"

            }],

            "GTIN": "<xsl:call-template name="json-string">

                        <xsl:with-param name="value" select="Line/BarCode"/>

                    </xsl:call-template>",

            "PhysicalDetails": [{

                "PackQualifier": "CP",

                "PackWidth": <xsl:call-template name="json-number">

                        <xsl:with-param name="value" select="Line/UnitWidth"/>

                    </xsl:call-template>

            }],

            "ProductColorDescription": "<xsl:call-template name="json-string">

                                            <xsl:with-param name="value" select="Line/ProductColorDescription"/>

                                        </xsl:call-template>",

            "ProductID": [{

                "PartNumber": "<xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Line/MatchedItemCode"/>

                                </xsl:call-template>",

                "PartNumberQual": "CB"

            }],

            "ProductOrItemDescription": [{

                "ProductCharacteristicCode": "08",

                "ProductDescription": "<xsl:call-template name="json-string">

                                            <xsl:with-param name="value" select="Line/ItemDescription"/>

                                        </xsl:call-template>"

            }],

            "ProductSizeDescription": "<xsl:call-template name="json-string">

                                            <xsl:with-param name="value" select="Line/ProductSizeDescription"/>

                                        </xsl:call-template>",

            "References": [{

                "ReferenceID": "<xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="BatchNumber"/>

                                </xsl:call-template>",

                "ReferenceQual": "BT"

            }],

            "ShipQty": <xsl:call-template name="json-number">

                            <xsl:with-param name="value" select="Quantity"/>

                        </xsl:call-template>,

            "VendorPartNumber": "<xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Line/MatchedItemCode"/>

                                </xsl:call-template>"

        }<xsl:if test="position() != last()" >,</xsl:if>

                </xsl:for-each>

        <xsl:if test="position() != last()" >,</xsl:if>

            </xsl:for-each>

        ],

        "Notes": [{

            "Note": "<xsl:call-template name="json-string">

                        <xsl:with-param name="value" select="''"/>

                    </xsl:call-template>",

            "NoteCode": "SPE"

        }],

        "PhysicalDetails": [{

            "PackQualifier": "OU",

            "PackValue": <xsl:call-template name="json-number">

                        <xsl:with-param name="value" select="count(Pallets/Pallet)"/>

                    </xsl:call-template>

        }],

        "ShippingSerialID": "<xsl:call-template name="json-string">

                        <xsl:with-param name="value" select="PalletIdentifier"/>

                    </xsl:call-template>"

    } <xsl:if test="position() != last()" >,</xsl:if>

        </xsl:for-each>

    </xsl:when>

    <xsl:otherwise>

            <xsl:for-each select="Cartons/Carton">

        {

        "Address": [{

            "AddressLocationNumber": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="StorePartyIdentifier/Code"/>

                        </xsl:call-template>",

            "AddressName": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="StorePartyIdentifier/Name"/>

                        </xsl:call-template>",

            "AddressTypeCode": "Z7",

            "LocationCodeQualifier": "92",

            "Address1": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="StorePartyIdentifier/Street1"/>

                        </xsl:call-template>",

            "Address2": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="StorePartyIdentifier/Street2"/>

                        </xsl:call-template>",

            "AddressName": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="StorePartyIdentifier/Name"/>

                        </xsl:call-template>",

            "City": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="StorePartyIdentifier/Suburb"/>

                        </xsl:call-template>",

            "Country": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="StorePartyIdentifier/Country"/>

                        </xsl:call-template>",

            "PostalCode": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="substring(concat('00000',StorePartyIdentifier/PostCode), string-length(concat('00000',StorePartyIdentifier/PostCode))-4,5)"/>

                        </xsl:call-template>",

            "State": "<xsl:call-template name="json-string">

                            <xsl:with-param name="value" select="StorePartyIdentifier/State"/>

                        </xsl:call-template>"

        }],

        "Item": [

                <xsl:for-each select="CartonQuantities/CartonQuantity">

        {

            "BuyerPartNumber": "<xsl:choose>

                            <xsl:when test="Line/RetailerItemCode != '' ">

                                <xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Line/RetailerItemCode"/>

                                </xsl:call-template>

                            </xsl:when>

                            <xsl:otherwise>

                                <xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Line/MatchedItemCode"/>

                                </xsl:call-template>

                            </xsl:otherwise>

                        </xsl:choose>",

            "ConsumerPackageCode": "<xsl:choose>

                            <xsl:when test="Line/ConsumerPackageCode != '' ">

                                <xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Line/ConsumerPackageCode"/>

                                </xsl:call-template>

                            </xsl:when>

                            <xsl:otherwise>

                                <xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Line/BarCode"/>

                                </xsl:call-template>

                            </xsl:otherwise>

                        </xsl:choose>",

            "Dates": [{

                "Date": "<xsl:call-template name="json-date">

                                <xsl:with-param name="value" select="BestBeforeDate"/>

                        </xsl:call-template>",

                "DateTimeQualifier": "036"

            }],

            "GTIN": "<xsl:call-template name="json-string">

                        <xsl:with-param name="value" select="Line/BarCode"/>

                    </xsl:call-template>",

            "PhysicalDetails": [{

                "PackQualifier": "CP",

                "PackWidth": <xsl:call-template name="json-number">

                        <xsl:with-param name="value" select="Line/UnitWidth"/>

                    </xsl:call-template>

            }],

            "ProductColorDescription": "<xsl:call-template name="json-string">

                                            <xsl:with-param name="value" select="Line/ProductColorDescription"/>

                                        </xsl:call-template>",

            "ProductID": [{

                "PartNumber": "<xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Line/MatchedItemCode"/>

                                </xsl:call-template>",

                "PartNumberQual": "CB"

            }],

            "ProductOrItemDescription": [{

                "ProductCharacteristicCode": "08",

                "ProductDescription": "<xsl:call-template name="json-string">

                                            <xsl:with-param name="value" select="Line/ItemDescription"/>

                                        </xsl:call-template>"

            }],

            "ProductSizeDescription": "<xsl:call-template name="json-string">

                                            <xsl:with-param name="value" select="Line/ProductSizeDescription"/>

                                        </xsl:call-template>",

            "References": [{

                "ReferenceID": "<xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="BatchNumber"/>

                                </xsl:call-template>",

                "ReferenceQual": "BT"

            }],

            "ShipQty": <xsl:call-template name="json-number">

                            <xsl:with-param name="value" select="Quantity"/>

                        </xsl:call-template>,

            "VendorPartNumber": "<xsl:call-template name="json-string">

                                    <xsl:with-param name="value" select="Line/MatchedItemCode"/>

                                </xsl:call-template>"

        }<xsl:if test="position() != last()" >,</xsl:if>

            </xsl:for-each>

        ],

        "Notes": [{

            "Note": "<xsl:call-template name="json-string">

                        <xsl:with-param name="value" select="''"/>

                    </xsl:call-template>",

            "NoteCode": "SPE"

        }],

        "PhysicalDetails": [{

            "PackQualifier": "OU",

            "PackValue": <xsl:call-template name="json-number">

                        <xsl:with-param name="value" select="count(Cartons/Carton)"/>

                    </xsl:call-template>

        }],

        "ShippingSerialID": "<xsl:call-template name="json-string">

                        <xsl:with-param name="value" select="CartonIdentifier"/>

                    </xsl:call-template>"

    }<xsl:if test="position() != last()" >,</xsl:if>

        </xsl:for-each>

    </xsl:otherwise>

    </xsl:choose>    

    ]

}

    </xsl:template>        


    <xsl:template name="json-date">

        <xsl:param name="value"/>


        <xsl:choose>

            <xsl:when test="substring($value,5,1)='-' or substring($value,5,1)='/' ">

                <xsl:value-of select="concat(substring($value,1,4),substring($value,6,2),substring($value,9,2))"/>

            </xsl:when>

            <xsl:otherwise>

                <xsl:value-of select="concat(substring($value,7,4),substring($value,4,2),substring($value,1,2))"/>

            </xsl:otherwise>

        </xsl:choose>

    </xsl:template>

    <xsl:template name="json-string">

        <xsl:param name="value"/>


        <xsl:variable name="doublequote">"</xsl:variable>

        <xsl:variable name="singlequote">'</xsl:variable>

        <xsl:value-of select="translate( $value,$doublequote,$singlequote)"/>

    </xsl:template>

    

    <xsl:template name="json-number">

        <xsl:param name="value"/>


        <xsl:value-of select="$value"/>

    </xsl:template>

</xsl:stylesheet>