做的第一件事情就是要建立警告是否是假警报。
由于大量人犯同样的错误(每天约一个问StackOverflow问题,因此天堂只知道有多少人在默默地受苦),因此警告被添加到了Saxon。特别是,该错误是有这样的源文件:
<foo xmlns="http://default.namespace.com/">
<bar/>
<baz/>
</foo>
,然后写匹配模式,比如
<xsl:template match="foo"/>
<xsl:template match="bar"/>
,因为他们忽略了命名空间将不会匹配任何东西。
那么撒克逊确实是这样的:如果
(一)源文档的最外层元素是一个命名空间
(二)有在样式表中符合特定的元素名称
该模板规则
(c)中有由样式表匹配元素的命名空间和实际发生源文档
在命名空间之间没有交集然后将其输出此警告。
如果真的是虚惊一场,有一对夫妇的方法可以抑制它:
(一)增加一个虚拟模板规则到你的样式表,或许还有一个断言,这意味着它永远不会匹配任何东西,但它使用源文档的命名空间,只是告诉处理器你知道你在做什么。
(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
。
这是虚惊一场,我很乐意看到的细节,使我们可以细化检查。我们知道,有些情况下,当你最初的源文件要处理的文件的简单列表,所有的样式表的实际工作是在处理这些文件中的条件发生得相当合理,例如例;但我们认为值得少量误报,以帮助初学者解决这个简单而常见的问题。
喜迈克尔,感谢您回应.FeatureKeys.SUPPRESS_XSLT_NAMESPACE_CHECK在9.6加入我们目前正在使用9.5 – Hamzah
然后,你将不得不进行升级,或者使用其他的解决方法建议。但我会对我的问题的答案感兴趣。 –
虚拟模板与我一起工作。谢谢 – Hamzah