我有一个标记化变量,其中包含目录列表的.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新手。感谢您的耐心等候。
答案 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>