使用Java进行XSLT处理?

90

如何在Java中使用JDK和XSLT处理器转换XML?


2
好问题,+1。请参考我的答案,了解Saxon文档的指针和一个重要通知,在许多情况下,使用基于Java的XSLT处理器不需要了解Java。 - Dimitre Novatchev
11
这个答案有一个精确的答案,对于新手来说并不是非常明显。这个问题应该重新开放。 - Raedwald
1
由于在这里讨论使用程序员工具和编程语言,这是不相关的话题...摇头。 - rogerdpack
4个回答

168

以下是使用Java API进行转换的示例,正如@Raedwald所说:

import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;

public class TestMain {
    public static void main(String[] args) throws IOException, URISyntaxException, TransformerException {
        TransformerFactory factory = TransformerFactory.newInstance();
        Source xslt = new StreamSource(new File("transform.xslt"));
        Transformer transformer = factory.newTransformer(xslt);

        Source text = new StreamSource(new File("input.xml"));
        transformer.transform(text, new StreamResult(new File("output.xml")));
    }
}

输入也可以来自字符串或DOMSource,输出可以传输到DOMSource等


1
写得真好的例子!非常感谢! - crazyim5

12

我是 XSLT 的新手,有人能指导我如何用 Java 进行 XSLT 处理吗?

这取决于你使用的基于 Java 的 XSLT 处理器。每个 XSLT 处理器都有自己的 API。

例如,Saxon 6.5.5(用于 XSLT 1.0)和 Saxon 9.1.07(用于 XSLT 2.0)是用 Java 编写的。文档在http://www.saxonica.com/documentation/documentation.xml

几乎所有的 XSLT 处理器都有一个命令行工具,不需要编写程序就可以执行 XSLT 转换。

例如,这里是:如何从命令行启动 Saxon 9.x 转换

以下是我经常在命令行中使用 Saxon 的方式

java -Xms2048M  -Xmx10000M  -jar  
     C:\xml\Parsers\Saxon\Ver.9.1.0.7\J\saxon9.jar 
    -t  -repeat:1  -o %out%  %xml%  %xsl%  %param[ name=\"value\"]%

其中%out%是输出文件的名称,%xml%是xml文件,%xsl%是主要的xslt文件,%param[ name=\"value\"]%是外部参数的名称-值列表(我几乎总是将其留空)。


9
有一个标准的 XSLT API,可以查看 javax.xml.transform 包。除非有使用特定第三方库的强烈理由,否则我会使用它来代替任何具有自己 API 的第三方库。 - Jesper
1
@ Jesper:我们很幸运,使用API并不是唯一的方式!使用任何XSLT处理器的大多数XSLT程序员都不是Java程序员。如果剥夺了他们使用像Saxon或Xalan这样优秀的XSLT处理器的机会,那将是非常不幸和不合理的损失。事实上,生产需要Java编程才能使用的基于Java的XSLT处理器根本没有盈利空间。 - Dimitre Novatchev
5
但问题是关于如何使用Java进行XSLT处理的,谈论其他方式(不通过API)并不相关。如果要使用API进行操作,请使用标准API,除非有强制使用非标准API的原因。 - Jesper
1
@Jesper:不介绍如何在没有编程的情况下使用XSLT处理器,将对OP和其他读者构成不公,并使他们误以为编写程序是唯一的方法。我的回答是一个明确的信息:有一种更好、更方便的方法;只有在必要时才编写程序。 - Dimitre Novatchev

10

Java标准库提供了一个XML解析的(XSLT)转换接口。请查看API文档中的javax.xml.transform.Transformer类和javax.xml.transform.TransformerFactory类。


6
JAXP提供了一种独立于实现的方式来处理XSLT转换。这里是教程,可以帮助您入门。如果您正在处理庞大的XSLT和/或使用多个XSLT,则还有缓存已解析XSLT模板以提高性能的选项。本文解释了如何缓存xslt。

这好像已经消失了。 - gaurav kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接