【问题标题】:How to compile schematron conditions (XPaths/XSLT 2.0) in Java如何在 Java 中编译 schematron 条件 (XPaths/XSLT 2.0)
【发布时间】:2017-08-24 07:41:58
【问题描述】:

我想从 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;
            }
        };
    }
});

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

【问题讨论】:

  • 假设您在 XSLT/XPath/Schematron 中使用某个版本的 Saxon 9,那么您可以在代码中使用例如XPath xpath = new net.sf.saxon.xpath.XPathFactoryImpl().newXPath(); 使用 XPath 的 Saxon 实现。
  • 是的,我使用的是 Saxon8 实现,这也适用于这个版本:D 我必须添加的唯一额外内容是一个空的 XPathVariableResolver,例如 xpath.setXPathVariableResolver(new XPathVariableResolver() { public Object resolveVariable(QName arg0) { return ""; } });

标签: java xml xslt xpath schematron


【解决方案1】:

JDK 中javax.xml.xpath.XPath 的默认实现仅支持 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,它可能更易于使用。有关 Saxon 文档的详细信息,请访问 www.saxonica.com。

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

【讨论】:

  • 我确实在使用 Saxon,所以@martin-honnen 解决方案非常有效。刚刚添加了一个 VariableResolver(我确信我们将来会添加某种 FunctionResolver)。谢谢你们!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 2011-05-30
相关资源
最近更新 更多