使用xslt将多个xml文件合并到一个xml文件中

时间:2016-06-08 06:11:44

标签: xml

我想将多个xml文件合并到单个xml文件中,同时发送到BizTalk中的目标文件夹。帮助我使用xslt或其他更简单的方法将多个xml文件转换为单个xml文件。请注意所有输入文件都包含相同的命名空间 输入1

<?xml version="1.0" encoding="utf-8"?>
<ns0:AssetStatusResF xmlns:ns0="http://uCustoms/IL/MC/AssetStockResF/v1.0"
    xmlns:nsHeader="http://uCustoms/Common/Header/v1.0">
    <Body>
        <parameter>
            <AssetID>KK/KDRM115/I/06/15</AssetID>
            <StatusCode>D</StatusCode>
            <Status>Penghapusan</Status>
            <PlacementLocationCode>160101/BGN/HU/09/B12</PlacementLocationCode>
            <PlacementLocation>BILIK TIMBALAN PENGARAH (PERJAWATAN)</PlacementLocation>
            <PlacementDate>12/7/2008 12:00:00 AM</PlacementDate>
            <DisposedDate/>
        </parameter>
    </Body>
</ns0:AssetStatusResF>

输入2

    <?xml version="1.0" encoding="utf-8"?>
<ns0:AssetStatusResF xmlns:ns0="http://uCustoms/IL/MC/AssetStockResF/v1.0"
    xmlns:nsHeader="http://uCustoms/Common/Header/v1.0">
    <Body>
        <parameter>
            <AssetID>KK/KDRM115/H/06/4</AssetID>
            <StatusCode>A</StatusCode>
            <Status>Sedang Digunakan</Status>
            <PlacementLocationCode>160101/BGN/HS/09/B07</PlacementLocationCode>
            <PlacementLocation>BILIK PENASIHAT</PlacementLocation>
            <PlacementDate>12/26/2017 12:00:00 AM</PlacementDate>
            <DisposedDate/>
        </parameter>
    </Body>
</ns0:AssetStatusResF>

input3,4 .......继续

输出

    <?xml version="1.0" encoding="utf-8"?>
<ns0:AssetStatusResF xmlns:ns0="http://uCustoms/IL/MC/AssetStockResF/v1.0"
    xmlns:nsHeader="http://uCustoms/Common/Header/v1.0">
    <Body>
        <parameter>
            <AssetID>KK/KDRM115/H/06/4</AssetID>
            <StatusCode>A</StatusCode>
            <Status>Sedang Digunakan</Status>
            <PlacementLocationCode>160101/BGN/HS/09/B07</PlacementLocationCode>
            <PlacementLocation>BILIK PENASIHAT</PlacementLocation>
            <PlacementDate>12/26/2017 12:00:00 AM</PlacementDate>
            <DisposedDate/>
        </parameter>
        <parameter>
            <AssetID>KK/KDRM115/I/06/15</AssetID>
            <StatusCode>D</StatusCode>
            <Status>Penghapusan</Status>
            <PlacementLocationCode>160101/BGN/HU/09/B12</PlacementLocationCode>
            <PlacementLocation>BILIK TIMBALAN PENGARAH (PERJAWATAN)</PlacementLocation>
            <PlacementDate>12/7/2008 12:00:00 AM</PlacementDate>
            <DisposedDate/>
        </parameter>
    </Body>
</ns0:AssetStatusResF>

2 个答案:

答案 0 :(得分:0)

这是一种方式。

创建一个文档,列出要在collection.xml中组合的文档:

<collection>
  <doc href="input1.xml"/>
  <doc href="input2.xml"/>
  <doc href="input3.xml"/>
</collection>

然后使用collection.xml作为源文档和以下样式表进行XSLT转换:

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="collection">
  <ns0:AssetStatusResF xmlns:ns0="http://uCustoms/IL/MC/AssetStockResF/v1.0">
    <Body>
      <xsl:copy-of select="document(doc/@href)/*/Body/parameter"/>
    </Body>
  </ns0:AssetStatusResF>
</xsl:template>

</xsl:transform>

这适用于XSLT 1.0。如果转到XSLT 2.0,则可以使用更灵活的方式提供输入,例如,您可以使用collection()函数访问目录中的所有文件。

答案 1 :(得分:0)

如果您使用的是XSLT 2.0,可以使用几种替代方案。首先,您可以将文档列表定义为样式表参数,作为字符串序列传递:

<xsl:param name="docs" as="xs:string*"/>

<xsl:template match="collection">
  <ns0:AssetStatusResF xmlns:ns0="http://uCustoms/IL/MC/AssetStockResF/v1.0">
    <Body>
      <xsl:copy-of select="document($docs)/*/Body/parameter"/>
    </Body>
  </ns0:AssetStatusResF>
</xsl:template>

或者您可以将文档定义为集合。 Saxon和其他一些处理器将集合URI映射到文件存储目录。在撒克逊你可以做到:

    <xsl:template name="main">
      <ns0:AssetStatusResF xmlns:ns0="http://uCustoms/IL/MC/AssetStockResF/v1.0">
        <Body>
          <xsl:copy-of select="collection('file:///c:/mydocs?select=*.xml')/*/Body/parameter"/>
        </Body>
      </ns0:AssetStatusResF>
    </xsl:template>

最有效的方法取决于您决定处理哪些输入文档,而且您还没有真正解释过。