Java 如何使用Saxon XSLT转换每个xml节点?
如何使用Saxon xslt转换库将包含多个节点的xml文件转换为纯csv字符串?意思是,我希望Saxon将每个员工条目连接为csv,并将它们放在一起 这是saxon设置,但我不知道如何无法使用它转换输入xml文件:Java 如何使用Saxon XSLT转换每个xml节点?,java,xml,xslt,saxon,Java,Xml,Xslt,Saxon,如何使用Saxon xslt转换库将包含多个节点的xml文件转换为纯csv字符串?意思是,我希望Saxon将每个员工条目连接为csv,并将它们放在一起 这是saxon设置,但我不知道如何无法使用它转换输入xml文件: //false = does not required a feature from a licensed version of Saxon. Processor processor = new Processor(false); XsltCompiler
//false = does not required a feature from a licensed version of Saxon.
Processor processor = new Processor(false);
XsltCompiler compiler = processor.newXsltCompiler();
compiler.compile(new StreamSource("transformation.xslt"));
Serializer serializer = processor.newSerializer();
serializer.setOutputProperty(Serializer.Property.OMIT_XML_DECLARATION, "yes");
//TODO
//String result = serializer...serializeNodeToString();
我想转换以下xml:
<employees stage="test">
<employee>
<details>
<name>Joe</name>
<age>34</age>
</details>
<address>
<street>test</street>
<nr>12</nr>
</address>
</employee>
<employee>
<address>....</address>
<details>
<!-- note the changed order of elements! -->
<age>24</age>
<name>Sam</name>
</details>
</employee>
</employees>
Xslt可能类似于:
<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="employee">
<xsl:value-of select="name"/>
<xsl:value-of select="age"/>
</xsl:template>
</xsl:transform>
XSLT模板可以修改如下。可根据所需顺序选择元件
<xsl:template match="employee">
<xsl:value-of select="ancestor::employees/@stage, details/name, details/age, address/street, address/nr" separator=", " />
<xsl:text>
</xsl:text>
</xsl:template>
为了在Java中使用XSLT转换XML,我大部分时间使用以下代码片段。此方法将转换后的XML作为字符串返回。所需的库是saxon9he.jar。您可能必须升级库版本才能与XSLT 3.0一起使用
public static String transformXML(String xml, InputStream xslFile) {
String outputXML = null;
try {
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xslFile));
Source xmlStream = new StreamSource(new StringReader(xml));
StringWriter writer = new StringWriter();
Result result = new StreamResult(writer);
transformer.transform(xmlStream, result);
outputXML = writer.getBuffer().toString();
} catch (TransformerConfigurationException tce) {
tce.printStackTrace();
} catch (TransformerException te) {
te.printStackTrace();
}
return outputXML;
}
这里有两个问题吗?如何使用Saxon9和Java来执行XSLT转换,以及如何为特定任务编写XSLT样式表?至于XSLT任务,第二个address元素是否不包含任何子元素,而只包含文本。。。。?什么定义了CSV的顺序?两者都包含,不包含更多的子元素。顺序应该由属性的顺序来设置。是和。我只是懒得再复制地址详细信息。在使用现有xslt时,我最好需要帮助,了解如何正确地将xml转换为字符串java代码。
test, Joe, 34, test, 12
test, Sam, 24, test1, 123
public static String transformXML(String xml, InputStream xslFile) {
String outputXML = null;
try {
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xslFile));
Source xmlStream = new StreamSource(new StringReader(xml));
StringWriter writer = new StringWriter();
Result result = new StreamResult(writer);
transformer.transform(xmlStream, result);
outputXML = writer.getBuffer().toString();
} catch (TransformerConfigurationException tce) {
tce.printStackTrace();
} catch (TransformerException te) {
te.printStackTrace();
}
return outputXML;
}