将 saxon 升级到 9.5.1.8 后出现警告消息

Warning Messages appeared after upgrade saxon to 9.5.1.8

我们正在将 saxon 9.3.0.2 升级到 saxon ee-9.5.1.8,升级完成后我们会收到很多警告

net.sf.saxon.trans.XPathException: The source document is in namespace [MY-NAME-SPACE] , but none of the template rules match elements in this namespace
    at net.sf.saxon.Controller.warning(Controller.java:954)
    at net.sf.saxon.Controller.transformDocument(Controller.java:2081)
    at net.sf.saxon.Controller.transform(Controller.java:1911)

我从 xsl 中删除了名称空间,但仍然收到此警告 任何人都知道这是怎么回事?如何删除此警告?

首先要做的是确定警告是否是误报。

因为有很多人犯同样的错误(每天大约有一个人在 Whosebug 上提问,所以天知道有多少人在默默忍受),所以添加了 Saxon 的警告。特别是,错误是有这样一个源文件:

<foo xmlns="http://default.namespace.com/">
  <bar/>
  <baz/>
</foo>

然后写匹配模式如

<xsl:template match="foo"/>
<xsl:template match="bar"/>

永远不会匹配任何东西,因为它们忽略了命名空间。

所以撒克逊人所做的是这样的:如果

(a) 源文档的最外层元素在命名空间中

(b) 样式表中有匹配特定元素名称的模板规则

(c) 样式表匹配的元素的名称空间与源文档中实际出现的名称空间之间没有交集

然后输出这个警告。

如果真的是误报,有两种方法可以抑制它:

(a) 向您的样式表添加一个虚拟模板规则,也许带有一个谓词,这意味着它永远不会匹配任何东西,但它使用源文档的名称空间,只是为了告诉处理器您知道您在做什么做。

(b) 设置配置 属性 FeatureKeys.SUPPRESS_XSLT_NAMESPACE_CHECK,这可以在 API 中进行,如下所示:

import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.XsltCompiler;

Processor processor = new Processor(configuration);
processor.setConfigurationProperty(FeatureKeys.SUPPRESS_XSLT_NAMESPACE_CHECK, "true");
XsltCompiler xsltCompiler = processor.newXsltCompiler();

或从命令行添加 --suppressXsltNamespaceCheck:on.

这是误报,我很想知道详细信息,以便我们改进检查。我们确实知道,在某些情况下,条件可能会非常合理地发生,例如,当您的初始源文档是要处理的文件的简单列表时,样式表的所有实际工作都在处理这些文件;但我们认为,为了让初学者免于解决这个简单而常见的问题的挫败感,少量误报是值得的。