【问题标题】:how to specify the input directory using any of the loop for multiple inputs?如何使用任何循环为多个输入指定输入目录?
【发布时间】:2016-06-20 20:31:00
【问题描述】:
public class MultiXslt
{
    public static void main(String[] args) throws TransformerException,ParserConfigurationException, SAXException, IOException 
    {
        //source xslt
        StreamSource stylesource = new StreamSource("C:/Users/santhanamk/Desktop/newxslt/Xslt inputs/Idml0.xsl");

        DocumentBuilderFactory docbFactory = DocumentBuilderFactory
                .newInstance();
        DocumentBuilder dBuilder = docbFactory.newDocumentBuilder();

        //source XML
        Document sourceDoc = dBuilder.parse("C:/Users/santhanamk/Desktop/newxslt/input.xml");

        DOMSource source = new DOMSource(sourceDoc);

        TransformerFactory transformerFactory = TransformerFactory
                .newInstance();
        Transformer transformer = transformerFactory
                .newTransformer(stylesource);

        Document document = dBuilder.newDocument();
        DOMResult result = new DOMResult(document);

        transformer.transform(source, result);

        Node resultDoc = ((Document) result.getNode()).getDocumentElement();

        System.out.println(resultDoc.getChildNodes().getLength());

        // print the result
        StringWriter writer = new StringWriter();
        Transformer transformer2 = transformerFactory.newTransformer();
        transformer2.transform(new DOMSource(resultDoc), new StreamResult(writer));
        String s = writer.toString();     

    }
}

实际上我有一个 xml 文件和多个 xsl 文件(C:/Users/santhanamk/Desktop/newxslt/Xslt 输入/xsl 列表)。当我将 xml 和 xsl0 作为输入时,我需要将输出作为字符串。所以在我得到输出后,我需要为 xsl1 提供与输入字符串相同的输出,以获得另一个输出(字符串)。然后我需要将输出作为 xsl2 的输入字符串来获得另一个输出。当给定的源目录(C:/Users/santhanamk/Desktop/newxslt/Xslt 输入/xsl 列表)没有任何新的 xsl 文件来加载输出字符串时,它应该以 xml 形式给出最终输出!

【问题讨论】:

  • 所以你的问题是,你如何循环输入 xlst 文件?
  • 如果您有一个 XSLT 样式表目录,您如何确定要应用的样式表的顺序?
  • 实际上,我有很多名为 idml0,idml1,idml2,idml3.....idml16 和单个 xml(input.xml) 的 xsl 文件。
  • 现在我正在处理 1 或 2 个 xslt 文件。

标签: java xml xslt


【解决方案1】:

我认为使用 JAXP 转换 API,如果您想链接转换,那么 http://docs.oracle.com/javaee/1.4/tutorial/doc/JAXPXSLT8.html 有一个示例可以做到这一点,使用由 SAXTransformerFactory.newXMLFilter 创建的 XMLFilters。

这是一个示例 Java 代码,它展示了如何使用样式表文件名数组并设置过滤器链:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLFilter;
import org.xml.sax.XMLReader;


public class JAXPTransChain1 {


    public static void main(String[] args) throws FileNotFoundException, SAXException, ParserConfigurationException, TransformerException {
        String[] stylesheets = new String[] {"sheet1.xsl", "sheet2.xsl", "sheet3.xsl"};
        String inputDoc = "input1.xml";
        chainSheets(stylesheets, inputDoc, new StreamResult(System.out));
    }

    private static void chainSheets(String[] stylesheets, String inputDoc, Result result) throws FileNotFoundException, ParserConfigurationException, SAXException, TransformerConfigurationException, TransformerException {
        InputSource input = new InputSource(new FileInputStream(inputDoc));

        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setNamespaceAware(true);
        XMLReader reader = spf.newSAXParser().getXMLReader();

        SAXTransformerFactory stf = (SAXTransformerFactory)TransformerFactory.newInstance();

        XMLReader parent = reader;

        for (int i = 0; i < stylesheets.length; i++)
        {
            String sheetUri  = stylesheets[i];
            XMLFilter sheetFilter = stf.newXMLFilter(new StreamSource(new FileInputStream(sheetUri)));
            sheetFilter.setParent(parent);
            parent = sheetFilter;
        }

        Transformer proc = stf.newTransformer();

        SAXSource transSource = new SAXSource(parent, input);

        proc.transform(transSource, result);   

    }

}

如果输入是类似的样本

<root>
    <foo>bar</foo>   
</root>

样式表确实如此,例如

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/node()[last()]">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
        <xsl:comment>sheet 1</xsl:comment>
    </xsl:template>

</xsl:stylesheet>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/node()[last()]">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
        <xsl:comment>sheet 2</xsl:comment>
    </xsl:template>

</xsl:stylesheet>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/node()[last()]">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
        <xsl:comment>sheet 3</xsl:comment>
    </xsl:template>

</xsl:stylesheet>

那么最终的输出是

<?xml version="1.0" encoding="UTF-8"?><root>
    <foo>bar</foo>   
</root><!--sheet 1--><!--sheet 2--><!--sheet 3-->

所以样式表都按照输入数组的顺序应用了。一旦你知道你想要的顺序,就应该很容易从目录中的文件列表中设置这样一个数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    相关资源
    最近更新 更多