XSLT 2.0 ---文档集合顺序()

时间:2014-12-08 11:48:12

标签: xml xslt-2.0

我有一个要合并的多个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>

2 个答案:

答案 0 :(得分:1)

查看它委托给File.listFiles的{​​{3}}的源代码,它不保证排序(一般来说,虽然在某些平台上可能比在其他平台上更一致)。< / p>

答案 1 :(得分:1)

<xsl:sort select="tokenize(document-uri(.), '/')[last()]"/>行对于我使用的具有类似需求的进程(按文件名输入对输出转换后的XML进行排序)可以很好地工作。请注意,我已经通过用引号“结束选择并应用自动关闭标记来适应Martin的行。