做的第一件事情就是要建立警告是否是假警報。
由於大量人犯同樣的錯誤(每天約一個問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