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