2017-08-24 133 views
1

我想從Java代碼來驗證Schematron的條件(這到底是一個XSLT布爾評價)知道,如果語法正確。我們的用戶可以提供額外的驗證規則,我們將轉換爲schematron來驗證給定的XML文件,但我們想知道這些規則是否最終有意義。如何編譯Schematron的條件(的XPath/XSLT 2.0)在Java中

我有方法試圖從編譯javax.xml.xpath.XPath中,但似乎缺少的東西,如「作爲澆注料」等默認xslt2.0功能/經營者。我試圖提供一個默認的XPathFuntionResolver來告訴XPath忽略這些函數,但似乎沒有辦法。

XPath xpath = XPathFactory.newInstance().newXPath(); 
xpath.setXPathFunctionResolver(new XPathFunctionResolver() { 
    @Override 
    public XPathFunction resolveFunction(QName functionName, int arity) { 
     return new XPathFunction() {  
      @Override 
      public Object evaluate(List args) throws XPathFunctionException { 
       return null; 
      } 
     }; 
    } 
}); 

哪個是驗證這些用戶定義規則的最佳方法?

+0

假設您爲您的XSLT/XPath/Schematron使用特定版本的Saxon 9,那麼在您的代碼中,您可以使用例如'XPath xpath = new net.sf.saxon.xpath.XPathFactoryImpl()。newXPath();'使用XPath的Saxon實現。 –

+0

是的,我使用的是Saxon8實現,這也適用於這個版本:d 我不得不添加的唯一額外的事情是一個空XPathVariableResolver,如 'xpath.setXPathVariableResolver(新XPathVariableResolver(){ \t公衆對象resolveVariable(的QName爲arg0){ \t \t \t回報 「」; \t \t} });' – Yampeku

回答

1

javax.xml.xpath.XPath在JDK中的缺省實現只支持XPath 1.0,但您的特定XPath表達式的XPath 2.0(或更高版本)。在Java平臺上有幾種可用的XPath 2.0第三方實現,Saxon產品(我的)是最知名的。

您可以使用標準的API javax.xml.xpath.XPath中,馬丁Honnen建議使用撒克遜的XPath引擎;但是API是圍繞XPath 1.0設計的,因此利用XPath 2.0的全部功能可能會非常棘手(例如,您無法輕鬆評估返回日期的表達式)。所以撒克遜有一個叫做s9api的替代API,它可能更易於使用。有關薩克森文檔的詳細信息,請訪問www.saxonica.com。

你使用自定義的函數解析器是不會幫助的XPath 1.0引擎理解的語法結構,如「X澆注料爲Y」的方法 - 它只是用來解決函數調用。

+0

我確實是用撒克遜人,所以@馬丁 - honnen解決方案完美地工作。剛剛添加了一個VariableResolver(我確信將來會添加某種FunctionResolver)。謝謝你們兩位! – Yampeku