Xslt 问题-使用变量中的值对多个XML文件进行XSL搜索
我有一个标记化变量,它包含目录列表的.txt文件名列表。我想在多个子目录中的多个xml文件中查找这些文件名。如果找到文件名,我想输出在“xmlfile”中找到的“filename” 有很多xml目录,它们不是静态的。xml文件也是如此。xml中没有标记文件名,所以我只是在文件中查找它们的纯文本出现情况 任何帮助都将不胜感激 为了使示例更简单,我想使用 $filenames_to_find(来自.txt目录列表的标记化文件名列表) 搜查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 输出为 在
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”。感谢您为我指明了正确的方向-我不想占用您太多的时间!希望有人会来帮助我了解循环查询语法,这样就可以开始了!干杯