使用 SAXON 和 XSLT 合并 XML 文件
Posted
技术标签:
【中文标题】使用 SAXON 和 XSLT 合并 XML 文件【英文标题】:Merging XML Files Using SAXON and XSLT 【发布时间】:2021-11-24 21:15:13 【问题描述】:我是XSLT
和SAXON
的新手,我希望完成以下任务:
我有一长串 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
节点下的所有文件的所有内容(所有 <xpath>
元素及其子元素)。
【问题讨论】:
到目前为止你尝试过什么?这似乎是一个基本问题。 正如我所提到的,我是 XSLT 和 SAXON 的新手,有人建议我使用它们。我没有找到输出单个文件的方法。在 SAXON(命令 :SAXON -xsl:mergefiles.xsl -s:../../benchmark/ -o:./ )中,当您提供文件目录时,输出仍然是目录并生成单独的文件 这应该让你开始:***.com/questions/19021205/… 撒克逊语的哪个版本? 这是一个奇怪的旧版本,但它应该允许您从命名模板开始并使用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
运行撒克逊。
【参考方案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 文件的主要内容,如果未能解决你的问题,请参考以下文章