Добавление отсутствующих узлов в XML через XSLT - PullRequest
0 голосов
/ 31 мая 2019

Я использую инструмент для импорта файлов 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>

1 Ответ

1 голос
/ 31 мая 2019

Как насчет:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...