【问题标题】:Add namespace to a specific node of XML using XSLT使用 XSLT 将命名空间添加到 XML 的特定节点
【发布时间】:2014-07-23 18:13:40
【问题描述】:

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

输入 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 中添加什么?

【问题讨论】:

    标签: xslt namespaces xslt-1.0


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢迈克尔。我最终得到了下面的 XSLT,它有两个部分。问题是,当我单独尝试这些时,它们可以完美地工作,但是在一起时,第二部分就不起作用了。我在这里做错了什么:
    • Micael,我不需要这两个命名空间:"xmlns:xsi="w3.org/2001/XMLSchema-instance" xmlns:xsd="w3.org/2001/XMLSchema" 我们可以避免它们吗?
    • 工作就像一个魅力!感谢您的帮助迈克尔!
    猜你喜欢
    • 1970-01-01
    • 2010-12-22
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2014-03-16
    • 1970-01-01
    相关资源
    最近更新 更多