我有一个要合并的多个XML文件的目录。这些文件按照它们应合并的顺序命名,例如:file1.xml, file2.xml, file3.xml
..文件数量各不相同。
此代码用于合并文件:
<xsl:for-each select="
collection(iri-to-uri('/home/book/?select=*.html;recurse=yes'))">
<xsl:apply-templates select="node()|@*"/>
</xsl:for-each>
关注/问题:这是巧合并合并文件的吗?我是否需要重新编码以强制执行文件的有序读取?如果有,有什么建议吗?
(使用Saxon)
更新:我相信伊恩的回复是正确的,即:不保证订购。我正在处理这样的代码(要重构和验证)。我不确定这是一种强有力的方法。
<!-- load the directory file names into a variable -->
<xsl:variable name="file-names">
<collection>
<xsl:for-each select="collection('/home/book/?select=*.html')">
<file>
<xsl:value-of select="tokenize(document-uri(.), '/')[last()]"/>
</file>
</xsl:for-each>
</collection>
</xsl:variable>
<!-- open the files in a sorted order -->
<xsl:template match="/">
<xsl:for-each select="$file-names/collection/file">
<xsl:sort select="replace(., '[^\d]', '')" data-type="number" />
<xsl:variable name="filename" select="concat('/home/book/', . )"/>
<xsl:copy-of select="doc($filename)"/>
</xsl:for-each>
</xsl:template>
答案 0 :(得分:1)
查看它委托给File.listFiles
的{{3}}的源代码,它不保证排序(一般来说,虽然在某些平台上可能比在其他平台上更一致)。< / p>
答案 1 :(得分:1)
<xsl:sort select="tokenize(document-uri(.), '/')[last()]"/>
行对于我使用的具有类似需求的进程(按文件名输入对输出转换后的XML进行排序)可以很好地工作。请注意,我已经通过用引号“结束选择并应用自动关闭标记来适应Martin的行。