【问题标题】:XSL - Generating list of files from directory on networkXSL - 从网络上的目录生成文件列表
【发布时间】:2020-07-09 08:02:55
【问题描述】:

我正在尝试使用 collection 函数列出具有 xsl 的目录文件。它似乎适用于正常用例(在本地目录中搜索),但在网络上搜索路径时失败:例如。 \\name_of_machine\the\path\to\folder

日志错误是:

FODC0002: The file or directory
  file:/D:/the/current/location/of/the/executing/xsl/%5C%5Cname_of_machine2%5Cthe%5Cpath%5Cto%5Cfolder does not exist

还有我的代码中的一个 sn-p:

<xsl:variable name="docList" select="for $f in collection($dir) return lower-case($f)"/>

因此,基本上,collection 函数将执行代码的 XSL 文件的当前位置添加到前面,然后转义所有 \(反斜杠)字符。

如何使用收集功能通过网络检索文件?

编辑: 我正在使用 Saxon-HE 9.8.0-15

【问题讨论】:

  • 我认为,在 Windows 上代表 Java 的 UNC 路径的文件 URI 将是 file:////name_of_machine/the/path/to/folder 但我不知道它是否适用于 Saxon 9 的 collection 目录搜索“魔法” .
  • 我担心将 UNC 文件名表示为 URI 的问题由来已久。首先,缺乏标准:直到最近,文件:URI 方案的 RFC 都非常模糊。与此相关,在不同的产品中有不同的实现方式:Java 和 .NET 的方式不同。但无论您做什么,collection() 函数都需要一个 URI,而不是文件名,并且 URI 不包含反斜杠。
  • @MichaelKay 感谢您的信息!如果不允许使用反斜杠,在使用 Saxon 访问网络上的文件时,哪种方法最好?
  • 最后,我使用了@MartinHonnen 建议的解决方案

标签: xml xslt saxon


【解决方案1】:

我认为您可以使用例如&lt;xsl:variable name="doc-list" select="uri-collection('file:////name_of_machine/the/path/to/folder?select=*.xml')"/&gt; 获取 Saxon 9 目录中文件的 URI 列表。我认为表示此类路径的 URI 语法是 file:////name_of_machine/the/path/to/folder

在使用 Saxon 9.8 的 Windows 10 机器上进行的测试给出了

java -cp 'C:\Program Files\Saxonica\Saxon9.8HE\saxon9he.jar' net.sf.saxon.Query -t -qs:"uri-collection('file:////machine-name/Users/marti/SomeFolder/xml?select=*.xml')"
Saxon-HE 9.8.0.15J from Saxonica
Java version 1.8.0_252
Analyzing query from {uri-collection('file:////machine-name/Users/marti/SomeFolder/xml?select=*.xml')}
Analysis time: 194.6869 milliseconds
<?xml version="1.0" encoding="UTF-8"?>file:////machine-name/Users/marti/SomeFolder/xml/sample1.xml file:////machine-name/Us
ers/marti/SomeFolder/xml/sample2.xml

【讨论】:

  • 感谢您的快速回复!我知道 UNC 语法在 kb.blackbaud.com/articles/Knowledge/48745 的示例中指定,您无法以其他方式访问它。当我按照说明编写 URL 时,Saxon 不知道如何处理它。
  • “如上所述”指的是什么,我在答案中的建议或您链接到的文章的语法?您从撒克逊人那里得到的究竟是哪个错误?
  • 我已经多次尝试使用您的示例,直到我弄清楚:似乎还有一种误导行为让我相信 uri-collection 没有正确返回,但在修复它之后我可以确认您的解决方案有效。非常感谢!
  • 换句话说:它适用于 uri-collection('file:////machine-name/Users/marti/SomeFolder/xml?select=*.xml')
猜你喜欢
  • 2021-08-30
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2015-02-11
  • 2018-11-02
相关资源
最近更新 更多