XSLT - 从9.4.0-9更新到9.7.0-14的Saxon错误

时间:2016-12-29 13:01:48

标签: xslt xslt-2.0 saxon

在我的xslt中 当我将Saxon版本从9.4.0-9更新到9.7.0-14时,我得到了跟随错误。

net.sf.saxon.trans.XPathException:对集合的调用结果的必需项类型是node();提供的值具有项类型xs:string

这里的问题是什么?

<xsl:variable name="file-uris" as="xs:string*"
  select="if (empty($symbol.mappings.folder.uri)) then () else
     for $f in collection(concat($symbol.mappings.folder.uri, '?select=*.txt&amp;unparsed=yes'))
  return string($f/base-uri())"/>

1 个答案:

答案 0 :(得分:0)

Saxon 9.7中的collection()函数发生了重大变化,由XPath 3.0和3.1中的规范更改引发 - 遗憾的是,对任何类型资源(例如JSON文件)的集合的泛化使得它很难保持100%向后兼容性。

这里的具体问题是,通过“未解析”选项,早期的Saxon发布预期了一种处理非文档集合的方法,这种方式被证明与规范随后发展的方式不兼容。如果在未启用XPath 3.0时collection()返回非节点值,则会发生特定错误,因为Saxon现在正在尝试遵循2.0和3.0规则,具体取决于哪个版本的XSLT / XPath处于活动状态。启用3.0并使用默认配置设置时,文件扩展名“.txt”足以使集合中的资源作为xs:string的实例返回,但如果未启用3.0,则不起作用。

(程序性说明:欢迎您在此处提出撒克逊问题,但如果您在saxonica.plan.io的支持网站上提出问题,我们会发现更容易跟踪它们 - 如果您在那里提出问题,那么我们会尝试确保它以令人满意的分辨率关闭,而在这里提出的问题更令人反复。)