内存中带有外部函数 (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 映射器中,但这是错误的解决方案 - [非常]糟糕的做法。
我用什么:
- Java 7
- SAXON-HE 9.8.0 处理器
- XSLT 2.0
提供具有逻辑的编译时 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很强大
我遇到了问题。我需要在 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 映射器中,但这是错误的解决方案 - [非常]糟糕的做法。
我用什么:
- Java 7
- SAXON-HE 9.8.0 处理器
- XSLT 2.0
提供具有逻辑的编译时 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很强大