如何在XSLT 1.0中引用一组文件?

时间:2013-10-15 22:38:00

标签: xslt glob

我有一组名为x1.xmlx2.xml的文件,最多约x50000.xml

我想在所有这些文件中搜索字符串,例如。 foo并返回其文件包含字符串foo的文件名集,例如。

<file>x12.xml<file>
<file>x511.xml<file>

我可以将所有文件名的列表传递到XSLT并使用document($uri)单独访问每个文件,但是在XSLT 1.0中有一些glob类功能,我可以在其中指定模式,例如。 document('x*.xml')?或者还有其他方式吗?

修改...

我正在使用PHP的XSL 1.0处理器libxslt

2 个答案:

答案 0 :(得分:2)

您可以生成一个XML文件,其中包含对各个XML文件的external entity个引用:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE doc [
    <!ENTITY fileContent1 SYSTEM "x1.xml">
    <!ENTITY fileContent2 SYSTEM "x2.xml">
    <!ENTITY fileContent3 SYSTEM "x2.xml">
]>
<doc>
    <file name="x1.xml">
        &fileContent1;
    </file>
    <file name="x2.xml">
        &fileContent2;
    </file>
    <file name="x3.xml">
        &fileContent3;
    </file>
</doc>

然后转换XML文件,该文件将包含外部实体引用引用的XML文件的所有内容。

如上面那样对XML实例执行下面的样式表会产生一个逗号分隔的列表,其中包含所有包含“foo”的文件名:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:param name="find-value" select="'foo'"/>

    <xsl:template match="/">
        <xsl:apply-templates select="doc/file[contains(., $find-value)]"/>
    </xsl:template>

    <xsl:template match="file">
        <xsl:value-of select="@name"/>
        <xsl:if test="position()!=last()">
            <xsl:text>, </xsl:text>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

是的,您可以在XSLT文件中使用VBScript的JavaScript。不同的XSLT处理器支持不同的脚本语言。 以下是一个示例,说明如何合并用户定义的VBScript functions in XSL/T