【问题标题】:Adding missing nodes to XML via XSLT通过 XSLT 将缺失的节点添加到 XML
【发布时间】:2019-05-31 13:34:55
【问题描述】:

我正在使用一种工具将 XML 文件导入 Dynamics NAV,但提供 XML 文件的某些方会跳过空节点。我的工具(外部)无法处理这些情况,所以我想包含 XSLT 来添加缺失的节点。 xslt 适用于 1 个节点,但添加多个节点不起作用。所以我一定做错了什么。

我正在构建与 Dynamics NAV 的集成以插入销售订单。订单使用 XML 文件从多方交付。然而,一些提供 XML 的各方并未在其 XML 文件中列出所有节点,而是跳过了空节点。我正在使用 Dynamics NAV(来自其他供应商的附加组件)中构建的工具来导入这些文件。然而,由于 XML 文件中缺少一些(空)节点,一些 XML 文件出错了。我知道这是附加组件中的一个问题,但我需要在短时间内找到解决方案。因此创建了一个 XSLT 来添加缺失的节点。它适用于 1 个缺失节点,但无法添加两个缺失节点。我对 XSLT 不是很熟悉,所以大多数时候它都是反复试验。也许有人可以帮助我。

这是提供的 XML 文件格式,有时缺少的节点是 DeliveryParty 节点和 DeliveryAddress 部分。

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<Orders>
  <Order>
    <Partner>
  <SenderEANCode>9999999999999</SenderEANCode>
      <RecipientEANCode>9999999999999</RecipientEANCode>
    </Partner>
    <OrderHeader>
      <OrderVersion>008</OrderVersion>
      <OrderTypeCode>220</OrderTypeCode>
      <Document>
        <DocumentNumber>34034040</DocumentNumber>
        <Date>2019-04-18</Date>
      </Document>
      <DeliveryDate>2019-04-24</DeliveryDate>
      <CompleteDelivery>YES</CompleteDelivery>
      <Supplier>9999999999999</Supplier>
      <Buyer>9999999999999</Buyer>
      <Invoicee>9999999999999</Invoicee>
      <DeliveryParty>9999999999999</DeliveryParty>
      <DeliveryAddress>
        <DeliveryName>Private     Customer</DeliveryName>
        <DeliveryStreet>Teststraat</DeliveryStreet>
        <DeliveryCity>TestCity</DeliveryCity>
        <DeliveryCountry>NL</DeliveryCountry>
        <DeliveryTelNo></DeliveryTelNo>
        <DeliveryEmail>test@test.com</DeliveryEmail>
      </DeliveryAddress>
    </OrderHeader>
    <OrderLine>
      <LineItemNumber>1</LineItemNumber>
      <GTIN>9999999999999</GTIN>
      <OrderedQuantity>
        <Quantity>260</Quantity>
      </OrderedQuantity>
    </OrderLine>
  </Order>
</Orders>

有时 DeliveryParty 节点丢失,有时 DeliveryAddress 部分(包括子节点)丢失。我创建了以下 XSLT 来添加这些节点,但由于它是反复无常的,我需要一些帮助来解决这个问题。我是 XSLT 的新手,我可以做一些小的改动,但我不经常使用它,所以知识很快就会消失。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="@*|node()">
   <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
   </xsl:copy>
</xsl:template>

<xsl:template match="Orders/Order/OrderHeader[not(DeliveryParty)]">
  <xsl:copy-of select="*"/>  
  <DeliveryParty/>
</xsl:template>

<xsl:template match="Orders/Order/OrderHeader[not(//DeliveryAddress)]">
 <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
     <DeliveryAddress>
       <DeliveryName></DeliveryName>
       <DeliveryStreet></DeliveryStreet>
       <DeliveryPostalCode></DeliveryPostalCode>
       <DeliveryCity></DeliveryCity>
       <DeliveryCountry></DeliveryCountry>
       <DeliveryTelNo></DeliveryTelNo>
       <DeliveryEmail></DeliveryEmail>
     </DeliveryAddress> 
   </xsl:copy>
</xsl:template>

使用上面提到的 XSLT,添加了 DeliveryAddress 节点及其子节点,但没有添加交付方。

当文件像这样传递时:

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<Orders>
  <Order>
    <Partner>
  <SenderEANCode>9999999999999</SenderEANCode>
      <RecipientEANCode>9999999999999</RecipientEANCode>
    </Partner>
    <OrderHeader>
      <OrderVersion>008</OrderVersion>
      <OrderTypeCode>220</OrderTypeCode>
      <Document>
        <DocumentNumber>34034040</DocumentNumber>
        <Date>2019-04-18</Date>
      </Document>
      <DeliveryDate>2019-04-24</DeliveryDate>
      <CompleteDelivery>YES</CompleteDelivery>
      <Supplier>9999999999999</Supplier>
      <Buyer>9999999999999</Buyer>
      <Invoicee>9999999999999</Invoicee>
    </OrderHeader>
    <OrderLine>
      <LineItemNumber>1</LineItemNumber>
      <GTIN>9999999999999</GTIN>
      <OrderedQuantity>
        <Quantity>260</Quantity>
      </OrderedQuantity>
    </OrderLine>
  </Order>
</Orders>

结果应该是这样的:

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<Orders>
  <Order>
    <Partner>
  <SenderEANCode>9999999999999</SenderEANCode>
      <RecipientEANCode>9999999999999</RecipientEANCode>
    </Partner>
    <OrderHeader>
      <OrderVersion>008</OrderVersion>
      <OrderTypeCode>220</OrderTypeCode>
      <Document>
        <DocumentNumber>34034040</DocumentNumber>
        <Date>2019-04-18</Date>
      </Document>
      <DeliveryDate>2019-04-24</DeliveryDate>
      <CompleteDelivery>YES</CompleteDelivery>
      <Supplier>9999999999999</Supplier>
      <Buyer>9999999999999</Buyer>
      <Invoicee>9999999999999</Invoicee>
      <DeliveryParty></DeliveryParty>
      <DeliveryAddress>
        <DeliveryName></DeliveryName>
        <DeliveryStreet></DeliveryStreet>
        <DeliveryCity></DeliveryCity>
        <DeliveryCountry></DeliveryCountry>
        <DeliveryTelNo></DeliveryTelNo>
        <DeliveryEmail></DeliveryEmail>
      </DeliveryAddress>
    </OrderHeader>
    <OrderLine>
      <LineItemNumber>1</LineItemNumber>
      <GTIN>9999999999999</GTIN>
      <OrderedQuantity>
        <Quantity>260</Quantity>
      </OrderedQuantity>
    </OrderLine>
  </Order>
</Orders>

【问题讨论】:

    标签: xslt nodes


    【解决方案1】:

    怎么样:

    XSLT 1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <!-- identity transform -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="OrderHeader">
        <xsl:copy>
            <xsl:apply-templates/>
            <xsl:if test="not(DeliveryParty)">
                <DeliveryParty/>
            </xsl:if>
            <xsl:if test="not(DeliveryAddress)">
                <DeliveryAddress>
                    <DeliveryName/>
                    <DeliveryStreet/>
                    <DeliveryPostalCode/>
                    <DeliveryCity/>
                    <DeliveryCountry/>
                    <DeliveryTelNo/>
                    <DeliveryEmail/>
                </DeliveryAddress>
            </xsl:if>
        </xsl:copy>
    </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多