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

扬佩库

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

我尝试过从 javax.xml.xpath.XPath 编译方法,但似乎缺少诸如“castable as”和其他默认 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;
            }
        };
    }
});

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

迈克尔·凯

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

正如 Martin Honnen 建议的那样,您可以使用标准 javax.xml.xpath.XPath API 来使用 Saxon 的 XPath 引擎;但是 API 是围绕 XPath 1.0 设计的,因此利用 XPath 2.0 的全部功能可能会很棘手(例如,您无法轻松评估返回日期的表达式)。所以 Saxon 有一个名为 s9api 的替代 API,它可能更容易使用。有关撒克逊文档的详细信息,请访问 www.saxonica.com。

您使用自定义函数解析器的方法不会帮助 XPath 1.0 引擎理解诸如“X castable as Y”之类的句法结构——它仅用于解析函数调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章