XSLT 1.0 (xsltproc) - Как использовать XSLT для анализа значений XML и добавления их в уже сформированный XML? - PullRequest
0 голосов
/ 12 июля 2019

Output.xml уже сформирован.

Мне нужно проанализировать Input.xml, чтобы найти Feature_ID для Test_ID из сопоставления в Input.xml и добавить его в Output.xml.

Я думал, что это можно сделать с помощью XSLT. Как будет выглядеть XSLT?

Input.xml

<Mapping>
  <Test>
    <Test_ID>123</Test_ID>
    <Feature_ID>111</Feature_ID>
  </Test>
   <Test>
    <Test_ID>456</Test_ID>
    <Feature_ID>222</Feature_ID>
  </Test>
</Mapping>

Текущий (уже сформированный) Output.xml

<?xml version="1.0" encoding="UTF-8"?>
<Suite>
  <Test>
    <Test_ID>123</Test_ID>
    <Test_Name>Test_First</Test_Name>
  </Test>
   <Test>
    <Test_ID>456</Test_ID>
    <Test_Name>Test_Second</Test_Name>
  </Test>
</Suite>

Желаемый выход.xml

<Suite>
  <Test>
    <Test_ID>123</Test_ID>
    <Test_Name>Test_First</Test_Name>
    <Feature_ID>111</Feature_ID>
  </Test>
   <Test>
    <Test_ID>456</Test_ID>
    <Test_Name>Test_Second</Test_Name>
    <Feature_ID>222</Feature_ID>
  </Test>
</Suite>

Кроме того, как передать файл Output.xml в приведенной ниже команде?

xsltproc XSLT.xsl Input.xml> Output_New.xml

1 Ответ

1 голос
/ 12 июля 2019

Чтобы скопировать элементы из одного документа в другой, рассмотрите функцию document() в сценарии XSLT.Затем вызовите xsltproc только для запуска основного входного документа.

На самом деле, в зависимости от желаемого результата, Ввод должен быть Ввод и наоборот, поскольку корнем является Suite .

XSLT (уведомление Input.xml указано внутри)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/Suite">
     <xsl:copy>
       <xsl:apply-templates select="Test"/>
     </xsl:copy>
    </xsl:template>

    <xsl:template match="Test">
     <xsl:copy>
       <xsl:variable name="curr_id" select="Test_ID"/>
       <xsl:copy-of select="Test_ID|Test_Name"/>
       <xsl:copy-of select="document('Input.xml')/Mapping/Test[Test_ID = $curr_id]/Feature_ID"/>
     </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

xsltproc

xsltproc myScript.xsl Output.xml > myDesiredResult.xml

Результат

<Suite>
  <Test>
    <Test_ID>123</Test_ID>
    <Test_Name>Test_First</Test_Name>
    <Feature_ID>111</Feature_ID>
  </Test>
  <Test>
    <Test_ID>456</Test_ID>
    <Test_Name>Test_Second</Test_Name>
    <Feature_ID>222</Feature_ID>
  </Test>
</Suite>
...