使用XSLT将命名空间添加到XML的特定节点

时间:2014-06-03 12:01:06

标签: xslt namespaces xslt-1.0

我需要添加两个不同的命名空间,首先是根节点,第二个是特定节点。我也在删除空节点。

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

当前的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>

当前输出:

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

必需输出:

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

请建议我应该在当前的XSLT中添加什么内容?

1 个答案:

答案 0 :(得分:2)

我相信您需要添加以下两个模板:

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

您还需要将前两个模板(删除空节点的模板)的优先级提高到2。


编辑:

  

我不需要这两个命名空间:   “的xmlns:的xsi =” w3.org/2001/XMLSchema-instance“;   的xmlns:XSD = “w3.org/2001/XMLSchema”;我们可以避免它们吗?

我不确定这是否重要,但如果您愿意,请将最后一个模板替换为:

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