0

I have a requirement to add two different namespaces, first to the root node and second to a specific node. I am also removing empty nodes.

Input XML:

<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder">
  <Header>
    <Company>180</Company>
    <Action>Create</Action>
  </Header>
  <Body>
    <MessageParts>
      <SalesOrder>
        <SalesTable class="entity">
          <CurrencyCode>USD</CurrencyCode>
          <CustAccount>12345</CustAccount>
          <CustomerRef xsi:nil="true" />
          <Deadline xsi:nil="true" />
          <DeliveryDate>2014-05-08</DeliveryDate>
          <DeliveryName>Deln</DeliveryName>
          <DlvMode>5d</DlvMode>
          <DlvTerm xsi:nil="true" />
          <KwdBulkIndicator xsi:nil="true" />
          <KwdCancelDate>2014-05-08</KwdCancelDate>
          <KwdCollector xsi:nil="true" />
          <KwdCreditAnalyst xsi:nil="true" />
          <KWDCustomerDepartment xsi:nil="true" />
          <KwdCustomerPurchaseOrderDate xsi:nil="true" />
          <KwdCustZeroPriceOrder xsi:nil="true" />
          <KWDDivision>RTC</KWDDivision>
          <KwdEDIEventCode xsi:nil="true" />
          <KwdEDIMerchType xsi:nil="true" />
          <KWDLabel xsi:nil="true" />
          <KwdMatchingBulk xsi:nil="true" />
          <KwdOrderClassificationId>Regular</KwdOrderClassificationId>
          <KwdOrderFulfillmentStatus>0</KwdOrderFulfillmentStatus>
          <KwdPlannedPickupDate xsi:nil="true" />
          <KwdRMAUpdateTypeStatus xsi:nil="true" />
          <KwdRMAUpdateTypeStatusDate xsi:nil="true" />
          <KwdShipByDate>2014-05-08</KwdShipByDate>
          <KwdSourceOrderTotal>800.00</KwdSourceOrderTotal>
          <KwdStartShipDate>2014-05-08</KwdStartShipDate>
          <KwdStopShipDate xsi:nil="true" />
          <KwdVendorNumber xsi:nil="true" />
          <LineDisc xsi:nil="true" />
          <Payment xsi:nil="true" />
          <PurchOrderFormNum>43123</PurchOrderFormNum>
          <ReceiptDateRequested>2014-05-08</ReceiptDateRequested>
          <ReturnDeadline xsi:nil="true" />
          <ReturnItemNum xsi:nil="true" />
          <ReturnReasonCodeId xsi:nil="true" />
          <ReturnReplacementCreated xsi:nil="true" />
          <ReturnReplacementId xsi:nil="true" />
          <ReturnStatus xsi:nil="true" />
          <SalesGroup xsi:nil="true" />
          <SalesId xsi:nil="true" />
          <SalesOriginId>eCom</SalesOriginId>
          <SalesPoolId xsi:nil="true" />
          <ShippingDateRequested xsi:nil="true" />
          <sunShipToCode xsi:nil="true" />
          <sunShipToTypeCode xsi:nil="true" />
          <sunTAFBlocked xsi:nil="true" />
          <sunTAFHoldCode xsi:nil="true" />
          <sunTAFHoldReleaseDate xsi:nil="true" />
          <sunTAFHoldReleaseTime xsi:nil="true" />
          <sunTAFHoldReleaseUserId xsi:nil="true" />
          <sunTAFLocked xsi:nil="true" />
          <sunTAFMarkforAddressName xsi:nil="true" />
          <sunTAFMarkForCity xsi:nil="true" />
          <sunTAFMarkForCode xsi:nil="true" />
          <sunTAFMarkForCountryRegionId xsi:nil="true" />
          <SunTAFMarkForCountyId xsi:nil="true" />
          <sunTAFMarkForCountyIdy xsi:nil="true" />
          <sunTAFMarkForStateId xsi:nil="true" />
          <sunTAFMarkForStreet xsi:nil="true" />
          <sunTAFMarkForTypeCode xsi:nil="true" />
          <sunTAFMarkForZipCodeId xsi:nil="true" />
          <sunTAFSalesCategoryID xsi:nil="true" />
          <sunTAFShiptoAddressName xsi:nil="true" />
          <sunTAFShiptoCity xsi:nil="true" />
          <sunTAFShiptoCountryRegionId xsi:nil="true" />
          <sunTAFShipToCountyId xsi:nil="true" />
          <sunTAFShipToStateId xsi:nil="true" />
          <sunTAFShiptoStreet xsi:nil="true" />
          <sunTAFShiptoZipCode xsi:nil="true" />
          <SunTAFShipToZipCodeId xsi:nil="true" />
          <SunWMSAllowBackorders xsi:nil="true" />
          <SunWMSBlocked xsi:nil="true" />
          <SunWMSCartonPackQty xsi:nil="true" />
          <SunWMSCartonTypeId xsi:nil="true" />
          <SunWMSFulfillmentStatus>0</SunWMSFulfillmentStatus>
          <SunWMSIsAvailableForOutputOrder xsi:nil="true" />
          <SunWMSMarkforCode xsi:nil="true" />
          <SunWMSMaxFulfillmentStatus xsi:nil="true" />
          <SunWMSMaxQtyPerCarton xsi:nil="true" />
          <SunWMSMinShipQty xsi:nil="true" />
          <SunWMSOutputorderForWMS xsi:nil="true" />
          <SunWMSPackMethod xsi:nil="true" />
          <SunWMSPctFulfillItemColor xsi:nil="true" />
          <SunWMSPctFulfillOrderLines xsi:nil="true" />
          <SunWMSPctFullfillOrder xsi:nil="true" />
          <SunWMSSalesOrderFOPriority xsi:nil="true" />
          <SunWMSSlsCOORestricted xsi:nil="true" />
          <SunWMSVASMarkupGroup xsi:nil="true" />
          <SalesLine class="entity">
            <CustomerLineNum xsi:nil="true" />
            <DefaultDimension xsi:nil="true" />
            <DlvMode>5d</DlvMode>
            <ExternalItemId xsi:nil="true" />
            <ItemId xsi:nil="true" />
            <KwdBOMId xsi:nil="true" />
            <KwdCancelDate>2014-05-08</KwdCancelDate>
            <KwdCustItemNumber xsi:nil="true" />
            <KwdCustomerItemId xsi:nil="true" />
            <KwdDivision xsi:nil="true" />
            <KwdEComReturnDispositionCode xsi:nil="true" />
            <KwdExternalProductDescription xsi:nil="true" />
            <KwdFinalSaleStatus />
            <KwdFulfillmentStatus xsi:nil="true" />
            <KwdMasterLinesRecId xsi:nil="true" />
            <KwdSunWMSHarmonizationcode xsi:nil="true" />
            <KwdSunWMSHarmonizationcode2 xsi:nil="true" />
            <KwdSunWMSHarmonizationcode3 xsi:nil="true" />
            <KwdSunWMSHarmonizationcode4 xsi:nil="true" />
            <kwdUPCCode>123123420737</kwdUPCCode>
            <LineDisc xsi:nil="true" />
            <LinePercent>0</LinePercent>
            <SalesGroup xsi:nil="true" />
            <SalesPrice>125.00</SalesPrice>
            <SalesQty>2</SalesQty>
            <SalesUnit>EA</SalesUnit>
            <SunShipToCode xsi:nil="true" />
            <sunShipToTypeCode xsi:nil="true" />
            <sunTAFCancelledQty xsi:nil="true" />
            <sunTAFMarkforAddressName xsi:nil="true" />
            <sunTAFMarkForCity xsi:nil="true" />
            <sunTAFMarkForCode xsi:nil="true" />
            <sunTAFMarkForCountryRegionId xsi:nil="true" />
            <sunTAFMarkForCountyId xsi:nil="true" />
            <sunTAFMarkForCountyIdy xsi:nil="true" />
            <sunTAFMarkForStateId xsi:nil="true" />
            <sunTAFMarkForStreet xsi:nil="true" />
            <sunTAFMarkForTypeCode xsi:nil="true" />
            <sunTAFMarkForZipCodeId xsi:nil="true" />
            <sunTAFShiptoAddressName>Sami</sunTAFShiptoAddressName>
            <sunTAFShiptoCity>CHESTERFIELD</sunTAFShiptoCity>
            <sunTAFShiptoCountryRegionId xsi:nil="true" />
            <sunTAFShipToCountyId>US</sunTAFShipToCountyId>
            <sunTAFShipToStateId>United States</sunTAFShipToStateId>
            <sunTAFShiptoStreet>1234</sunTAFShiptoStreet>
            <sunTAFShipToZipCodeId>1234-0001</sunTAFShipToZipCodeId>
            <SunWMSFulfillmentStatus xsi:nil="true" />
            <LineDlvAddr class="entity">
              <City>CHESTERFIELD</City>
              <CountryRegionId>United States</CountryRegionId>
              <Location>123</Location>
              <LocationName xsi:nil="true" />
              <State>MO</State>
              <Street>1234</Street>
              <SunShipToCode xsi:nil="true" />
              <SunShipToTypeCode xsi:nil="true" />
              <SunTAFMarkForCode>Sami</SunTAFMarkForCode>
              <ZipCode>1234-0001</ZipCode>
            </LineDlvAddr>
            <MarkupTransLine class="entity">
              <CalculatedAmount xsi:nil="true" />
              <CurrencyCode xsi:nil="true" />
              <DocumentStatus xsi:nil="true" />
              <FromAmount xsi:nil="true" />
              <LineNum xsi:nil="true" />
              <MarkupCategory xsi:nil="true" />
              <MarkupCode xsi:nil="true" />
              <TaxAmount xsi:nil="true" />
              <TaxGroup xsi:nil="true" />
              <TaxItemGroup xsi:nil="true" />
              <TaxWriteCode xsi:nil="true" />
              <ToAmount xsi:nil="true" />
              <Txt xsi:nil="true" />
              <Value xsi:nil="true" />
              <Voucher xsi:nil="true" />
            </MarkupTransLine>
          </SalesLine>
          <DocuRefHeader class="entity">
            <Name>ECOM Remark</Name>
            <Notes xsi:nil="true" />
          </DocuRefHeader>
          <MarkupTransHeader class="entity">
            <CalculatedAmount xsi:nil="true" />
            <CurrencyCode xsi:nil="true" />
            <DocumentStatus xsi:nil="true" />
            <FromAmount xsi:nil="true" />
            <LineNum xsi:nil="true" />
            <MarkupCategory xsi:nil="true" />
            <MarkupCode xsi:nil="true" />
            <TaxAmount xsi:nil="true" />
            <TaxGroup xsi:nil="true" />
            <TaxItemGroup xsi:nil="true" />
            <TaxWriteCode xsi:nil="true" />
            <ToAmount xsi:nil="true" />
            <Txt xsi:nil="true" />
            <Value xsi:nil="true" />
            <Voucher xsi:nil="true" />
          </MarkupTransHeader>
        </SalesTable>
      </SalesOrder>
    </MessageParts>
  </Body>
</Envelope>

Current XSLT:

<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes="msxsl var" version="1.0" xmlns:ns0="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
  <xsl:template match="*[not(child::node()[normalize-space()])]"/>
  <xsl:template match="text()[not(normalize-space())][preceding-sibling::node()[1][self::*][not(child::node()[normalize-space()])]]" />
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Current Output:

<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Header>
    <Company>180</Company>
    <Action>Create</Action>
  </Header>
  <Body>
    <MessageParts>
      <SalesOrder>
        <SalesTable class="entity">
          <CurrencyCode>USD</CurrencyCode>
          <CustAccount>12345</CustAccount>
          <DeliveryDate>2014-05-08</DeliveryDate>
          <DeliveryName>Deln</DeliveryName>
          <DlvMode>5d</DlvMode>
          <KwdCancelDate>2014-05-08</KwdCancelDate>
          <KWDDivision>RTC</KWDDivision>
          <KwdOrderClassificationId>Regular</KwdOrderClassificationId>
          <KwdOrderFulfillmentStatus>0</KwdOrderFulfillmentStatus>
          <KwdShipByDate>2014-05-08</KwdShipByDate>
          <KwdSourceOrderTotal>800.00</KwdSourceOrderTotal>
          <KwdStartShipDate>2014-05-08</KwdStartShipDate>
          <PurchOrderFormNum>43123</PurchOrderFormNum>
          <ReceiptDateRequested>2014-05-08</ReceiptDateRequested>
          <SalesOriginId>eCom</SalesOriginId>
          <SunWMSFulfillmentStatus>0</SunWMSFulfillmentStatus>
          <SalesLine class="entity">
            <DlvMode>5d</DlvMode>
            <KwdCancelDate>2014-05-08</KwdCancelDate>
            <kwdUPCCode>123123420737</kwdUPCCode>
            <LinePercent>0</LinePercent>
            <SalesPrice>125.00</SalesPrice>
            <SalesQty>2</SalesQty>
            <SalesUnit>EA</SalesUnit>
            <sunTAFShiptoAddressName>Sami</sunTAFShiptoAddressName>
            <sunTAFShiptoCity>CHESTERFIELD</sunTAFShiptoCity>
            <sunTAFShipToCountyId>US</sunTAFShipToCountyId>
            <sunTAFShipToStateId>United States</sunTAFShipToStateId>
            <sunTAFShiptoStreet>1234</sunTAFShiptoStreet>
            <sunTAFShipToZipCodeId>1234-0001</sunTAFShipToZipCodeId>
            <LineDlvAddr class="entity">
              <City>CHESTERFIELD</City>
              <CountryRegionId>United States</CountryRegionId>
              <Location>123</Location>
              <State>MO</State>
              <Street>1234</Street>
              <SunTAFMarkForCode>Sami</SunTAFMarkForCode>
              <ZipCode>1234-0001</ZipCode>
            </LineDlvAddr>
            </SalesLine>
          <DocuRefHeader class="entity">
            <Name>ECOM Remark</Name>
            </DocuRefHeader>
          </SalesTable>
      </SalesOrder>
    </MessageParts>
  </Body>
</Envelope>

Required Output:

<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
  <Header>
    <Company>180</Company>
    <Action>Create</Action>
  </Header>
  <Body>
    <MessageParts>
      <SalesOrder xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder">
        <SalesTable class="entity">
          <CurrencyCode>USD</CurrencyCode>
          <CustAccount>12345</CustAccount>
          <DeliveryDate>2014-05-08</DeliveryDate>
          <DeliveryName>Deln</DeliveryName>
          <DlvMode>5d</DlvMode>
          <KwdCancelDate>2014-05-08</KwdCancelDate>
          <KWDDivision>RTC</KWDDivision>
          <KwdOrderClassificationId>Regular</KwdOrderClassificationId>
          <KwdOrderFulfillmentStatus>0</KwdOrderFulfillmentStatus>
          <KwdShipByDate>2014-05-08</KwdShipByDate>
          <KwdSourceOrderTotal>800.00</KwdSourceOrderTotal>
          <KwdStartShipDate>2014-05-08</KwdStartShipDate>
          <PurchOrderFormNum>43123</PurchOrderFormNum>
          <ReceiptDateRequested>2014-05-08</ReceiptDateRequested>
          <SalesOriginId>eCom</SalesOriginId>
          <SunWMSFulfillmentStatus>0</SunWMSFulfillmentStatus>
          <SalesLine class="entity">
            <DlvMode>5d</DlvMode>
            <KwdCancelDate>2014-05-08</KwdCancelDate>
            <kwdUPCCode>123123420737</kwdUPCCode>
            <LinePercent>0</LinePercent>
            <SalesPrice>125.00</SalesPrice>
            <SalesQty>2</SalesQty>
            <SalesUnit>EA</SalesUnit>
            <sunTAFShiptoAddressName>Sami</sunTAFShiptoAddressName>
            <sunTAFShiptoCity>CHESTERFIELD</sunTAFShiptoCity>
            <sunTAFShipToCountyId>US</sunTAFShipToCountyId>
            <sunTAFShipToStateId>United States</sunTAFShipToStateId>
            <sunTAFShiptoStreet>1234</sunTAFShiptoStreet>
            <sunTAFShipToZipCodeId>1234-0001</sunTAFShipToZipCodeId>
            <LineDlvAddr class="entity">
              <City>CHESTERFIELD</City>
              <CountryRegionId>United States</CountryRegionId>
              <Location>123</Location>
              <State>MO</State>
              <Street>1234</Street>
              <SunTAFMarkForCode>Sami</SunTAFMarkForCode>
              <ZipCode>1234-0001</ZipCode>
            </LineDlvAddr>
          </SalesLine>
          <DocuRefHeader class="entity">
            <Name>ECOM Remark</Name>
          </DocuRefHeader>
        </SalesTable>
      </SalesOrder>
    </MessageParts>
  </Body>
</Envelope>

Please suggest what should I add in the current XSLT?

1 Answer 1

2

I believe you need to add the folowing two templates:

<xsl:template match="*[ancestor-or-self::ns0:Envelope]">
    <xsl:element name="{local-name()}" namespace="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
        <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
</xsl:template>

<xsl:template match="*[ancestor-or-self::ns0:SalesOrder]" priority="1">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

You will also need to increase the priority of your first two templates (the ones that remove empty nodes) to 2.


Edit:

I don't need these two namespaces: "xmlns:xsi="w3.org/2001/XMLSchema-instance"; xmlns:xsd="w3.org/2001/XMLSchema"; can we avoid them?

I am not sure it matters, but if you want, replace the last template with:

<xsl:template match="*[ancestor-or-self::ns0:SalesOrder]" priority="1">
    <xsl:element name="{local-name()}" namespace="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder">
        <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
</xsl:template>
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks Michael. I am end up with below XSLT, which has two parts. Problem is, when I try these separately, they work perfectly, but together, second part doesn't work. What am I doing wrong here:
Micael, I don't need these two namespaces: "xmlns:xsi="w3.org/2001/XMLSchema-instance" xmlns:xsd="w3.org/2001/XMLSchema" can we avoid them?
Worked like a charm! Thanks for your help Michael!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.