使用 SAXON 和 XSLT 合并 XML 文件

Posted

技术标签:

【中文标题】使用 SAXON 和 XSLT 合并 XML 文件【英文标题】:Merging XML Files Using SAXON and XSLT 【发布时间】:2021-11-24 21:15:13 【问题描述】:

我是XSLTSAXON 的新手,我希望完成以下任务:

我有一长串 XML 文件代表一些基准,所有以下结构:

<benchmark>
    <xpath>
        <query>xxxxx</query>
        <ast depth="6" size="11">
            ...
        </ast>
        <schemas>
            <validation schema="xquery-3.0.xsd" valid="yes"/>
            ...
        </schemas>
    </xpath>
    <xpath>
        <query>yyyyy</query>
        <ast depth="6" size="11">
            ...
        </ast>
        <schemas>
            <validation schema="xquery-3.0.xsd" valid="yes"/>
            ...
        </schemas>
    </xpath>
</benchamark>

我只想将它们全部合并到一个 XML 文件中,该文件包含来自一个根 benchmark 节点下的所有文件的所有内容(所有 &lt;xpath&gt; 元素及其子元素)。

【问题讨论】:

到目前为止你尝试过什么?这似乎是一个基本问题。 正如我所提到的,我是 XSLT 和 SAXON 的新手,有人建议我使用它们。我没有找到输出单个文件的方法。在 SAXON(命令 :SAXON -xsl:mergefiles.xsl -s:../../benchmark/ -o:./ )中,当您提供文件目录时,输出仍然是目录并生成单独的文件 这应该让你开始:***.com/questions/19021205/… 撒克逊语的哪个版本? 这是一个奇怪的旧版本,但它应该允许您从命名模板开始并使用 collection 函数从目录中提取所有文件,例如&lt;xsl:template name="main"&gt;&lt;benchmark&gt;&lt;xsl:copy-of select="collection('../../benchmark/?select=*xml')/*/node()"/&gt;&lt;/benchmark&gt;&lt;/xsl:template&gt;。使用-xsl:mergefiles.xsl -it:main -o:merged-file.xml 运行撒克逊。 【参考方案1】:

最简单的方法是使用命名模板开始转换,不输入 XML,而是使用 collection 函数从目录中提取所有数据:

<xsl:template name="main">
  <benchmark>
    <xsl:copy-of select="collection('../../benchmark/?select=*xml')/*/node()"/>
  </benchmark>
</xsl:template>

然后使用选项-xsl:mergefiles.xsl -it:main -o:merged-file.xml 调用 Saxon。

【讨论】:

以上是关于使用 SAXON 和 XSLT 合并 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

XSLT 2 (Saxon):如何将多个文件读入内存

从 Saxon 9.4he 中的嵌入式资源加载 xml 和 xslt

是否有任何XSLT处理命令行工具? [关闭]

[每日一学]apache camel|XSLT|SAXON

如何在 Saxon-HE 中获得 EXSLT 支持?

使用 Saxon-JS 识别 XSLT 转换的性能瓶颈