我需要添加两个不同的名称空间,第一个到根节点,第二个到特定节点。我还删除了空节点。
输入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中添加什么?
我认为您需要添加以下两个模板:
<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>