如何在 Java 中编译 schematron 条件 (XPaths/XSLT 2.0)

How to compile schematron conditions (XPaths/XSLT 2.0) in Java

我想从 Java 代码中验证一个 schematron 条件(最后是一个 xslt 布尔值求值)以了解它在语法上是否正确。我们的用户可以提供额外的验证规则,我们会将其转换为 schematron 以验证给定的 XML 文件,但我们想知道这些规则最终是否有意义。

我尝试使用从 javax.xml.xpath.XPath 编译的方法,但似乎缺少 'castable as' 和其他默认 xslt2.0 functions/operators 之类的东西。我试图提供一个默认的 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;
            }
        };
    }
});

验证这些用户定义规则的最佳方式是什么?

javax.xml.xpath.XPath 在 JDK 中的默认实现仅支持 XPath 1.0,但您的特定 XPath 表达式是 XPath 2.0(或更高版本)。 Java 平台有几个 XPath 2.0 的第三方实现,Saxon 产品(我的)是最著名的。

您可以按照 Martin Honnen 的建议使用标准 javax.xml.xpath.XPath API 的 Saxon XPath 引擎;然而 API 是围绕 XPath 1.0 设计的,因此利用 XPath 2.0 的全部功能可能很棘手(例如,您不能轻易地评估 returns 日期的表达式)。所以 Saxon 有一个替代 API 叫做 s9api,它可能更容易使用。有关详细信息,Saxon 文档位于 www.saxonica.com.

您使用自定义函数解析器的方法不会帮助 XPath 1.0 引擎理解像 "X castable as Y" 这样的语法结构 - 它仅用于解析函数调用。