内存中带有外部函数 (functx) 的 XSLT

XSLT with external functions(functx) in memory

我遇到了问题。我需要在 Java 中使用 XSLT 2.0(SAXON-HE 9.8.0 处理器)转换 XML。在我的 XSLT 中,我使用(通过导入)来自 functx 的外部函数。

当两个文件(xslt 映射和带有 functx 的 .xsl 文件)在同一目录中 时,一切工作正常。 在我的 .xsl 中,functx 已正确导入并且有效:

xmlns:functx="http://www.functx.com"

xsl:导入 href="functx-package.xsl"

两个文件都在中时,有没有办法在我的 .xsl 映射中使用来自 functx 的外部函数内存作为 String 对象或 InputStreams 或其他什么?

我无法像以前那样将驱动器上的文件存储在一个目录中。

唯一可能解决我的问题的方法是将 functx 文件粘贴到我的 .xsl 映射器中,但这是错误的解决方案 - [非常]糟糕的做法。

我用什么:

提供具有逻辑的编译时 URIResolver

public Source resolve(String href, String base) {
  if (href.equals("functx-package.xsl")) {
     return new StreamSource(new StringReader(functxAsString));
  } else {
     return null;
  }
}

如果您使用的是 s9api,则编译时 URIResolver 是提供给 XsltCompiler 的,如果您使用的是 JAXP,则提供给 TransformerFactory。

总结一下:

import documentation from Saxon

要正确使用此解析器,我们需要在我们的 TransformerFactory 中设置它。每个转换器都将在导入中捕获 href,并将该文件与我们的 .xsl 文件作为字符串进行匹配。我还使用 outputURIResolver 来捕获输出并在内存中创建多个文件。 (outputURIResolver 的有趣用法 -

示例:

在 .xsl 文件中:

<xsl:import href="functx-package.xsl"/>
<xsl:import href="functs-package.xsl"/>

在 java 中:

   TransformerFactory tFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", XMLviaXSLTransformer.class.getClassLoader());

    tFactory.setURIResolver(new URIResolver() {
        @Override
        public Source resolve(String href, String base) {
            if (href.equals("functx-package.xsl")) {
                return new StreamSource(new StringReader(finalFunctsAsString));
            } else if (href.equals("functs-package.xsl")) {
                return new StreamSource(new StringReader(finalFunctxAsString));
            } else {
                return null;
            }
        }
    });

    Transformer transformer = tFactory.newTransformer(xsltMap);
    StreamResult standardResult = new StreamResult(new ByteArrayOutputStream());
    transformer.transform(xmlInput, standardResult);

谢谢迈克尔的帮助。这个URIResolver很强大