问题-XSL搜索使用针对多个XML文件的变量值

时间:2018-10-03 00:28:59

标签: xslt xslt-2.0

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

有很多xml目录,它们不是静态的。与xml文件相同。文件名未在xml中标记,因此我只是在寻找文件中是否存在纯文本。

任何帮助将不胜感激。

使示例更简单-我想使用

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

搜索

dir1/*.xml  
dir2/*.xml

输出为

在xmlfilename中找到

filename


我使用的是学术版的Oxygen XML,所以我认为Saxon可以通过它使用,并且我有独立的Saxon文件,可以从命令行运行它。

感谢到目前为止的答案以及更多的Google搜索,我明白了,这是行不通的。我知道它坏了,但是我不知道如何解决!

<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>

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

1 个答案:

答案 0 :(得分:1)

假设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>

实际上,您可以用test="contains($doc, .)"替换xsl:if测试,但是如果文档很大,效率可能会降低,因为它涉及将文档的整个字符串值组装为内存中的字符串。

另一种替代方法是将文件作为未解析的文本文件而不是XML文件进行处理,但这将需要对Saxon配置进行一些修改,以便它不会自动解析具有.xml文件扩展名的XML。 / p>