我们正在升级完成后将撒克逊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中删除了命名空间,但仍然收到此警告 任何人都知道发生了什么事?如何删除此警告?
答案 0 :(得分:2)
首先要确定警告是否是误报。
由于大量人犯同样的错误(每天大约有一天在StackOverflow上问问题,所以天堂只知道有多少人在默默地受苦),警告被添加到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
从命令行。
这是一个误报,我很想看到细节,以便我们可以改进检查。我们知道在某些情况下条件可以非常合理地发生,例如,当您的初始源文档是要处理的文件的简单列表时,样式表的所有实际工作都在处理这些文件;但我们认为值得少量误报,以免初学者解决这个简单而常见的问题。