【问题标题】:How to get info about which XSL version XSLT Processor runs如何获取有关 XSLT 处理器运行的 XSL 版本的信息
【发布时间】:2021-04-21 07:48:15
【问题描述】:

如何获取有关 XSLT 处理器运行的 XSL 版本的信息?

我正在评估 Saxon Home Edition (HE10-SJ)。由于这个包似乎同时带有 XSL2.0 和 XSL3.0,我想知道如何获取有关 XSLT 处理器将运行哪个 XSL 的信息。我完全知道在 XSL 文件中设置了 XSL 版本,但是即使我将 XSL 中的 XSL 版本添加到 5(显然不存在),它仍然会运行和处理。

我也明白,如果我在 XSL 样式表中添加专用于 XSL2.0/XSL3.0 的代码,并将 XSL 样式表设置为 XSL1.0,我很可能会收到错误或 XSLT 会不处理请求。

我添加了标志“-t”来获取一些信息,但只能看到 java 版本,而不是 XSLT/XSL 版本。提取结果在这里:

Saxon-HE 10.5J from Saxonica
Java version 11.0.10
Using parser com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser

【问题讨论】:

    标签: xml xslt xslt-1.0 xslt-2.0 xslt-3.0


    【解决方案1】:

    “XSLT 处理器”通常符合“XSLT 规范”的一个特定版本。特定软件产品可能包含适用于多个规范版本的 XSLT 处理器,但最好将它们视为不同的处理器,即使它们共享代码。

    给定一个 XSLT 处理器和一个样式表,处理器会查看 @version 属性,这会影响它的行为方式。

    如果@version="1.0",那么 XSLT 2.0 或 3.0 处理器将在“向后兼容模式”下评估某些结构,这更接近于 XSLT 1.0 处理器处理它们的方式。但它仍然是一个 XSLT 2.0 或 3.0 处理器,遵循 2.0 或 3.0 规范的规则,并且如果样式表使用需要 2.0 或 3.0 的结构,这些结构仍然可以工作。

    如果 version="5.0",比如说,处理器将在“向前兼容模式”下工作,这基本上意味着它会忽略它不理解的结构。前向兼容模式的初衷主要是为了在 Web 上部署,以便更轻松地编写在任何浏览器上运行的样式表,而不管它支持哪个 XSLT 版本。它在实现这一目标方面并不是很成功,(a) 因为浏览器从未超过 1.0,并且 (b) 因为简单地忽略新结构通常会给您带来无法使用的结果。这种概念对于像 CSS 这样的语言比对于 XSLT 更有意义。

    【讨论】:

      【解决方案2】:

      Saxon 9.8 及更高版本是 XSLT 3 处理器,当然您可以使用它们运行 XSLT 2 代码甚至 XSLT 1.0 代码,XSLT 1.0 处于向后兼容模式https://www.w3.org/TR/xslt-30/#backwards

      您可以查看system-property('xsl:version') 获取XSLT 版本,如果支持向后兼容模式,还可以查看属性xsl:supports-backwards-compatibility;它在 Saxon 10、9.9 和更高版本的 9.8 中。我认为只有最早的 9.8 HE 版本才尝试禁用该模式。

      【讨论】:

      • 似乎 Saxon 10 会根据 来判断运行哪个 XSL 版本。尽管我在提到的代码中添加了哪个版本,system-property('xsl:version') 将始终打印输出“3.0”,即使我故意添加错误错误,例如5.
      • system-property() 将返回处理器支持的(最高)版本。它将始终运行该版本,但如果您的样式表声明版本 1.0,它将以“兼容模式”运行:w3.org/TR/xslt20/#backwards
      • 使用version="5.0" 不是错误,它将 XSLT3 处理器置于向前兼容模式。我不知道你从哪里得到xml-stylesheet pi 声明 XSLT 版本的想法。
      • 请不要在 cmets 中提出后续问题,将它们作为新问题单独提出,包括您尝试过的所有细节、您得到的结果或错误、您期望的结果。
      【解决方案3】:

      这里有一些代码似乎可以解决问题,但肯定有更简单的方法吗?

      import java.io.*;
      import javax.xml.transform.*;
      import javax.xml.transform.stream.*;
      
      public final class StringSource extends StreamSource {
      
          final String string;
      
          private StringSource(final String string) {
              this.string = string;
          }
          @Override
          public Reader getReader() {
              return new StringReader(string);
          }
      
          private static final String STYLESHEET = ""
                  + "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">"
                  +     "<xsl:output method=\"xml\" omit-xml-declaration=\"yes\" />"
                  +     "<xsl:template match=\"/\"><xsl:value-of select=\"system-property('xsl:version')\"/></xsl:template>"
                  + "</xsl:stylesheet>";
      
          public static void main(final String[] args) throws Exception {
      
              final Templates    templates   = TransformerFactory.newInstance().newTemplates(new StringSource(STYLESHEET));
      
              final StringWriter writer      = new StringWriter();
      
              final Transformer  transformer = templates.newTransformer();
              ;                  transformer.transform(new StringSource("<AnyOldXml/>"), new StreamResult(writer));
      
              System.out.println("Max. Supported XSLT Version.: " + writer);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-14
        相关资源
        最近更新 更多