【问题标题】:XSLT 1.0 (xsltproc) - How to use XSLT to parse XML values and add them into an already formed XML?XSLT 1.0 (xsltproc) - 如何使用 XSLT 解析 XML 值并将它们添加到已经形成的 XML 中?
【发布时间】:2019-11-21 17:46:25
【问题描述】:

Output.xml 已经形成。

我必须解析 Input.xml 以从 Input.xml 中的映射中找到 Test_ID 的 Feature_ID 并将其添加到 Output.xml。

我在想这可以用 XSLT 来完成。 XSLT 会是什么样子?

输入.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

【问题讨论】:

    标签: xslt xslt-1.0


    【解决方案1】:

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

    实际上,根据您想要的结果,输入应该是输出,反之亦然,因为根是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:variable name="expr" select="document('FeatureID_Mapping.xml')/Mapping/Test[Test_ID = $curr_id]"/>
           <xsl:copy-of select="Test_ID|Test_Name"/>
           <xsl:choose>
                <xsl:when test="$expr">
                    <xsl:copy-of select="$expr/Feature_ID"/>
                </xsl:when>
                <xsl:otherwise>
                    <Feature_ID/>
                </xsl:otherwise>
           </xsl:choose>
         </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>
    

    【讨论】:

    • 用完全相同的代码尝试了上述解决方案。但是,myDesiredResult.xml 与 Output.xml 相同
    • 这个 [Test_ID = $curr_id] 是否尝试获取匹配的索引?
    • &lt;xsl:copy-of select="document('Input.xml')/Mapping/Test[2]/Feature_ID"/&gt; 。如果我像这样对索引进行硬编码,它可以打印所有输出值的第二个值。这意味着,从本质上讲,该解决方案的其余部分都在工作,只是没有使用 Test[Test_ID = $curr_id] 准确计算索引
    • 这已经用您发布的两个输入进行了测试。可能您的实际 XML 在某些方面有所不同。
    • 有没有办法调整你的解决方案,如果在映射 xml 中没有为测试 ID 找到对应的功能 ID,它仍然会在输出中打印一个空标签 ()对于未找到的?现在,它没有。
    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 2019-07-17
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    相关资源
    最近更新 更多