Xslt 问题-使用变量中的值对多个XML文件进行XSL搜索

Xslt 问题-使用变量中的值对多个XML文件进行XSL搜索,xslt,xslt-2.0,Xslt,Xslt 2.0,我有一个标记化变量,它包含目录列表的.txt文件名列表。我想在多个子目录中的多个xml文件中查找这些文件名。如果找到文件名,我想输出在“xmlfile”中找到的“filename” 有很多xml目录,它们不是静态的。xml文件也是如此。xml中没有标记文件名,所以我只是在文件中查找它们的纯文本出现情况 任何帮助都将不胜感激 为了使示例更简单,我想使用 $filenames_to_find(来自.txt目录列表的标记化文件名列表) 搜查 dir1/*.xml dir2/*.xml 输出为 在

我有一个标记化变量,它包含目录列表的.txt文件名列表。我想在多个子目录中的多个xml文件中查找这些文件名。如果找到文件名,我想输出在“xmlfile”中找到的“filename”

有很多xml目录,它们不是静态的。xml文件也是如此。xml中没有标记文件名,所以我只是在文件中查找它们的纯文本出现情况

任何帮助都将不胜感激

为了使示例更简单,我想使用

$filenames_to_find(来自.txt目录列表的标记化文件名列表)

搜查

dir1/*.xml  
dir2/*.xml
输出为

在xmlfilename中找到文件名


我使用的是Oxygen XML的学术版本,所以我想我已经有了Saxon,我有了独立的Saxon文件,可以从命令行运行它

多亏了到目前为止的答案和更多的谷歌搜索,我得到了这个,但它不起作用。我知道它坏了,但我不知道如何修理它

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:h="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="xs"
    version="3.0"
    expand-text="yes"
    >

    <xsl:variable name="filenames_from_directory_listing" as="xs:string" select="unparsed-text('filenames_from_directory_listing.txt')"/>
    <xsl:variable name="filenames_to_find" select="tokenize($filenames_from_directory_listing, '\s+')"/>

    <xsl:template match="/">
        <xsl:for-each select="collection('.?select=*.xml;recurse=yes')"/>
            <xsl:variable name="xml_filenames" select="."/>
                <xsl:for-each select="$filenames_to_find">
                    <xsl:if test="(contains($t, .))">
                        <xsl:message>{document-uri($xml_filenames)} contains {.}</xsl:message>
                    </xsl:if>
                </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

{documenturi($xml_filenames)}包含{.}

有什么建议吗?显然,我是XSL新手。感谢您的耐心。

假设使用Saxon或其他类似方式将集合URI映射到目录文件名的产品,您可以这样做

<xsl:for-each select="collection('.?select=*.xml;recurse=yes')">
   <xsl:variable name="doc" select="."/>
   <xsl:for-each select="$filenames">
     <xsl:if test="some $t in $doc//text() satisfies(contains($t, .))">
       <xsl:message>{document-uri($doc)} contains {.}</xsl:message>

{documenturi($doc)}包含{.}
实际上,您可以将xsl:if测试替换为
test=“contains($doc,)”
,但如果文档很大,则效率可能会降低,因为它需要将文档的整个字符串值组合为内存中的字符串


另一种选择是将文件作为未解析的文本文件而不是XML文件进行处理,但这需要对Saxon配置进行一些修改,以便它不会自动将扩展名为“.XML”的文件解析为XML。

您可以使用Saxon加载
collection
uri collection
collection
)文件分别从目录加载其URI(
collection
),例如
URI集合('?select=*.xml')
提供当前目录中的URI序列。请参阅“处理目录”in.感谢您的回复!由于我对XSL缺乏经验,您共享的示例让我有点困惑。我更新了我的问题。任何建议都非常感谢。抱歉,我没有费心关闭元素,因为我很忙,我认为您可以解决这个问题。显然,每个开始标记都需要相应的结束标记。还有大括号符号在xsl:message中是XSLT 3.0,要求您在xsl:stylesheet元素上添加expand text=“yes”。感谢您为我指明了正确的方向-我不想占用您太多的时间!希望有人会来帮助我了解循环查询语法,这样就可以开始了!干杯