2

我有一组名为的文件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

4

2 回答 2

2

您可以为各个 XML 文件生成带有外部实体引用的 XML 文件:

<?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>
于 2013-10-16T00:37:51.880 回答
0

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

于 2013-10-15T23:00:04.500 回答