当前位置: 首页 > 面试题库 >

如何使用多个输入中的任何循环指定输入目录?

王波
2023-03-14
问题内容
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!


问题答案:

我想使用JAXP转换API,如果您想链接转换,那么http://docs.oracle.com/javaee/1.4/tutorial/doc/JAXPXSLT8.html就有一个示例,使用XMLFilter通过创建的SAXTransformerFactory.newXMLFilter

这是一个示例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-->

因此样式表全部按照输入数组的顺序应用。一旦知道所需顺序,就很容易从目录中的文件列表中建立这样的数组。



 类似资料:
  • 我想制作一个程序,要求用户输入订票的客户数量,读取输入的数字,执行循环以询问每个客户的年龄,并决定每个客户的单价。到目前为止,我的代码只有if-else语句: 我如何添加一个同时循环来询问每个客户的年龄?

  • 我一直在寻找如何弄清楚如何让一个输入或某些东西进入一个time循环。就像在,输入()命令不会停止我的秒表。我尝试过tkinter、pygame和其他几种方法,但它们都不起作用。如果有人能帮我,我更喜欢小而简单的东西,如果这是可能的话。具体来说,我想学习做什么,基本上是允许在按下任何键时立即停止(最好不按回车键)。谢谢,马鞍猪! 以下是我到目前为止的情况,没有任何东西可以激活停止:

  • 对于这个问题,我需要用一个公式求出两个点之间的距离,给定两个点的坐标和值p。我让程序为一个输入行工作,但我希望用户能够输入多行,并让程序循环通过它们。例如: 1.0 1.0 2.0 2.0 1.0 我对java相当陌生,还在学习,所以我很感激我能得到的任何帮助。提前谢了。

  • 任何帮助都是非常感谢的

  • 我正在进行模拟测试,我正在努力创建一个循环,将循环输入12次,同时将每个输入添加到总和。 确定一个人在特定年份的平均体重。 对于每个月,您的算法应该输入该人当月的体重(正实数)。您的算法应该循环,重复输入,直到输入为正。 最后,您的算法输出平均权重。 在浏览了关于迭代控制结构的课堂笔记后,我想到了这个: 不幸的是,所有这些对我来说都是重复输入无限次,直到我输入一个大于12的数字。 我只想让控制台输

  • 我目前正在用Java编写一个程序,其中我需要从用户那里获得输入,这是一段文本。然而,我需要用户能够在一次输入文本的多个段落。当程序提示输入时,只需粘贴整段文本就可以实现这一点。我对输入使用扫描器,当我将多个段落粘贴到输入中时,无论何时打印存储文本的变量,都不会抛出错误,只输出第一节(在第一个换行符之前)。如何使用多个换行符存储整段文本,而不提示用户为每个文本块输入单独的输入? 我已经有了一些代码,