在java中使用Transformer从XSLT获取多个输出?

时间:2015-05-31 20:44:13

标签: java xml xslt xslt-2.0 transformer

我目前正在尝试让我的代码调用xml文件和xsl - 然后根据xml内容执行转换并输出多个结果文件。

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 TestTransformation {

public static void main(String[] args) throws TransformerException {

System.setProperty("javax.xml.transform.TransformerFactory","net.sf.saxon.TransformerFactoryImpl");
    TransformerFactory tFactory = TransformerFactory.newInstance();

    Source xslt = new StreamSource(new File("transformer.xslt"));

    Transformer transformer = tFactory.newTransformer(xslt);

    Source xmlText = new StreamSource(new File("data.xml"));

    transformer.transform(xmlText, new StreamResult(new File("output.xml")));

但是我希望转换能够生成多个输出文件..任何想法都会非常感激!!

2 个答案:

答案 0 :(得分:2)

  

我希望转换生成多个输出文件。

您可以在XSLT样式表本身中执行此操作:http://www.w3.org/TR/xslt20/#result-trees

这假设您确实使用的是XSLT 2.0处理器。在XSLT 1.0中,您可以使用EXSLT扩展名:http://exslt.org/exsl/elements/document/index.html - 只要您的处理器支持它。

答案 1 :(得分:0)

您应该使用<xsl:result-document/>生成多个文件(请注意,它仅在XSL 2.0版中可用)。 您也不需要指定输出文件。

以下代码显示了如何处理多个输出文件:

public class TestTransformation {

    public static void main(String[] args) throws TransformerException {
        TransformerFactory tFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", TestTransformation.class.getClassLoader());
        Source xslt = new StreamSource(new File("transformer.xslt"));
        Transformer transformer = tFactory.newTransformer(xslt);
        Source xmlText = new StreamSource(new File("data.xml"));
        transformer.transform(xmlText, new DOMResult());
    }
}

data.xml中:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="hello.xsl"?>
<p>
    <p1>Hello world!</p1>
    <p2>Hello world!</p2>
</p>

transformer.xml:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="p1">
        <xsl:result-document href="foo.xml"/>
    </xsl:template>
    <xsl:template match="p2">
        <xsl:result-document href="bar.xml"/>
    </xsl:template>
</xsl:stylesheet>