XSLT | Пример XML-преобразования

Например, есть два XML файла, данные которых нужно преобразовать в третий:
 
XML-файл 1:

 

document001.xml

 

<?xml version="1.0"?>
<ROOT_ELEMENT>
  <ELEMENT_04 ATTRIBUTE="1">
      <DATE>20210110</DATE>
  </ELEMENT_04>
  <ELEMENT_05 ATTRIBUTE="1">
      <NUM>1111111111</NUM>
  </ELEMENT_05>
</ROOT_ELEMENT>

 

XML-файл 2:

 

document002.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<docs>
  <receivingDateTime>2018-07-18T18:13:51.0</receivingDateTime>
  <seller>
      <ID SellerAttribute = "Actual">SellerActualCode</ID>
      <ID SellerAttribute = "Legal">SellerLegalCode</ID>
  </seller>
  <receiver>
      <ID ReceiverAttribute = "Actual">ReceiverActualCode</ID>
      <ID ReceiverAttribute="Legal">ReceiverLegalCode</ID>
  </receiver>
  <doc002LogisticUnit>
      <UnitIdentification>
          <sscc>100000000000000001</sscc>
      </UnitIdentification>
  </doc002LogisticUnit>
  <doc002LogisticUnit>
      <UnitIdentification>
          <sscc>100000000000000002</sscc>
      </UnitIdentification>
  </doc002LogisticUnit>
  <doc002LogisticUnit>
      <UnitIdentification>
          <sscc>100000000000000003</sscc>
      </UnitIdentification>
  </doc002LogisticUnit>
  <doc002LogisticUnit>
      <UnitIdentification>
          <sscc>100000000000000004</sscc>
      </UnitIdentification>
  </doc002LogisticUnit>
  <doc002LogisticUnit>
      <UnitIdentification>
          <sscc>100000000000000005</sscc>
      </UnitIdentification>
  </doc002LogisticUnit>
</docs>

 

XML-файл 3:

 

document003.xml

На примере XML-отчёта версии 1.34 ГС МДЛП (честныйзнак.рф)

 

<?xml version="1.0" encoding="UTF-8"?>
<documents version="1.34">
  <foreign_import action_id="332">
      <subject_id>id</subject_id>
      <seller_id>id</seller_id>
      <shipper_id>id</shipper_id>
      <custom_receiver_id>id</custom_receiver_id>
      <operation_date>yyyy-mm-ddThh:mm:ss.0</operation_date>
      <contract_type>1</contract_type>
      <doc_num>number</doc_num>
      <doc_date>dd.mm.yyyy</doc_date>
      <order_details>
          <sscc>100000000000000001</sscc>
      </order_details>
  </foreign_import>
</documents>

 

В этом примере создадим преобразователь XML-файлов 1 и 2 в XML-файл 3 с помощью XSLT в IntelliJ IDEA

 

1.Все файлы помещаются в один каталог, например Input_Output:

 

 

 

2.Открываем каталог Input_Output (проект) в IntelliJ IDEA:

 

 

 

3.Создаём в проекте новый XML-файл с именем, например combined, для объединения всех входящих XML-файлов:

 

 

 

4.Добавляем в combined.xml рыбу объединяющего XML-файла:

 

<?xml version="1.0" encoding="UTF-8"?>
 
<docs>
 <doc001></doc001>        
 <doc002></doc002>        
</docs>

 

 

5.В <doc001></doc001> копируем данные XML-файла 1 (document001.xml)

   В <doc002></doc002> копируем данные XML-файла 2 (document002.xml)

 

 

 

6.Создаём новый "XSLT Stylesheet" в папке проекта:

 

 

 

7.И сохраняем "XSLT Stylesheet" как convert.xslt

 

8.Указываем настройки RUN Сonfiguration для проекта: наименование преобразователя (например converter_example), что в проекте является скриптовым файлом (XSLT script file), что входящим в преобразование (XML input file) и куда сохранять результат преобразования (Save to File)
(см. также XLST настройки в IDEA)

 

 

 

9.Открываем входящий XML (combined.xml), XSLT (convert.xslt) и результат преобразования (document003.xml):

 

 

10. С помощью команды Split Vertically из контенкстного меню на вкладке файла выводим все три 3 файла в отдельные 3 окна:

 

 

 

 

11. Разработка XML-преобразования converter_example: данными combined.xml заполнить данные document003.xml:

 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
      <documents version="1.34">
          <foreign_import action_id="332">
              <subject_id>participant_id</subject_id>
              <xsl:variable name="seller">
                  <xsl:value-of select="/docs/doc002/seller/ID[@SellerAttribute='Legal']"/>
              </xsl:variable>
              <seller_id><xsl:value-of select="$seller"/></seller_id>
              <shipper_id><xsl:value-of select="$seller"/></shipper_id>
              <custom_receiver_id>
                  <xsl:value-of select="/docs/doc002/receiver/ID[@ReceiverAttribute='Actual']"/>
              </custom_receiver_id>
              <operation_date><xsl:value-of select="/docs/doc002//receivingDateTime"/></operation_date>
              <contract_type>1</contract_type>
              <doc_num><xsl:value-of select="/docs/doc001/ROOT_ELEMENT/ELEMENT_05/NUM"/></doc_num>
              <doc_date>
                  <!-- 20200218 -> 18.02.2020 -->
                  <xsl:variable name="raw">
                      <xsl:value-of select="/docs/doc001/ROOT_ELEMENT/ELEMENT_04/DATE"/>
                  </xsl:variable>
                  <xsl:value-of select="substring($raw, 7, 2)"/>.<xsl:value-of select="substring($raw, 5, 2)"/>.<xsl:value-of select="substring($raw, 1, 4)"/>
              </doc_date>
              <order_details>
                  <xsl:for-each select="/docs/doc002/doc002LogisticUnit/UnitIdentification/sscc">
                      <sscc><xsl:value-of select="."/></sscc>
                  </xsl:for-each>
              </order_details>
          </foreign_import>
      </documents>
  </xsl:template>
 
</xsl:stylesheet>

 

 

12. Для запуска XSLT:

(запускается converter_example, ранее настроенный, см. п. 8)

 

 

13. Результат запуска XSLT converter_example в файле document003.xml:

 

 

 

См. также:
Вызов XSLT-преобразователя через VBA



© 2006-2021 | Анна Петросян | pashelp@yandex.ru