如何合并带xsl:import继承的多个XSL文件?求Java工具或库
实现XSL文件扁平化的Java工具/方案
1. Saxon库(推荐)
Saxon是Java生态中最常用的XSL处理库,支持XSLT 1.0/2.0/3.0,自带合并导入XSL的能力,能自动处理xsl:import和xsl:include指令,生成完整的扁平XSL文件。
- 核心实现思路:用Saxon的
Processor加载主XSL文件,通过XsltCompiler编译为可执行样式表,再将其序列化回单个XSL文件。 - 示例代码片段:
import net.sf.saxon.s9api.*; import java.io.File; import java.io.FileOutputStream; public class XslFlattener { public static void main(String[] args) throws Exception { Processor processor = new Processor(false); XsltCompiler compiler = processor.newXsltCompiler(); XsltExecutable executable = compiler.compile(new File("main.xsl")); Serializer serializer = processor.newSerializer(new FileOutputStream("flattened.xsl")); executable.getUnderlyingCompiledStylesheet().export(serializer); } }
- 依赖说明:需引入Saxon-HE的Maven依赖(如
net.sf.saxon:Saxon-HE:12.4)。
2. Xalan库
Apache Xalan是另一款主流Java XSLT处理库,也可实现XSL扁平化:
- 实现思路:通过
TransformerFactory加载主XSL生成Templates对象,再将该对象序列化回XSL文件。不过它对复杂XSL继承结构的处理能力弱于Saxon,适合简单场景。 - 示例代码思路:
import javax.xml.transform.*; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import java.io.File; public class XalanFlattener { public static void main(String[] args) throws Exception { TransformerFactory factory = TransformerFactory.newInstance(); Templates templates = factory.newTemplates(new StreamSource(new File("main.xsl"))); Transformer transformer = templates.newTransformer(); // 需传入空XML作为输入触发序列化 transformer.transform(new StreamSource(new File("empty.xml")), new StreamResult(new File("flattened.xsl"))); } }
3. 自定义实现(简单场景)
如果你的XSL结构不复杂,可自行编写解析逻辑:
- 核心逻辑:递归遍历XSL文件,遇到
xsl:import或xsl:include时,读取对应导入文件内容,替换导入指令,最终拼接为单个文件。 - 注意事项:需处理命名空间、相对路径转绝对路径等细节,仅适合结构简单的场景。
生成扁平XSL后,可通过Maven的maven-assembly-plugin或maven-jar-plugin配置,将文件打包到JAR的指定目录中。
内容的提问来源于stack exchange,提问作者Alex Vagin
相关产品推荐
相关产品推荐

