XSLT 1.0(xsltproc)-如何使用XSLT解析XML值并将其添加到已经形成的XML中?

时间:2019-07-12 00:23:47

标签: xslt xslt-1.0

Output.xml已经形成。

我必须解析Input.xml才能从Input.xml的映射中找到Test_ID的Feature_ID,并将其添加到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>

所需的Output.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 个答案:

答案 0 :(得分:1)

要将元素从一个文档复制到另一个文档,请考虑XSLT脚本中的document()函数。然后仅在运行主输入文档时调用xsltproc

实际上,根据您想要的结果, Input 应该是 Output ,反之亦然,因为根是 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>