如何在 Java 中将 xsl 应用于 xml
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5977846/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to apply xsl to xml in Java
提问by user750508
This is problaby been asked a bunch of times, but I didn't really find what I was looking for exactly. I don't normally code in Java, but in C# so I am not comfortable with Java classes and such.
这可能被问过很多次了,但我并没有真正找到我想要的东西。我通常不使用 Java 编写代码,而是使用 C# 编写代码,因此我对 Java 类等不满意。
Question
问题
I need to create a method that takes 2 paramaters. 1. A string parameter (the xml - so needs to be converted to some xml class) 2. A string parameter with the xsl file path location
我需要创建一个需要 2 个参数的方法。1. 一个字符串参数(xml - 所以需要转换成一些 xml 类) 2. 一个带有 xsl 文件路径位置的字符串参数
The thing is I am making a factory class that must convert xml from a webservice into xml that my system can understand. I need a nice solution for that. Every method on the ws will have a xsl file - both the request (convert my xml to something that the ws understands) and the response (convert to something that my system understands).
问题是我正在制作一个工厂类,它必须将 xml 从 web 服务转换为我的系统可以理解的 xml。我需要一个很好的解决方案。ws 上的每个方法都将有一个 xsl 文件 - 请求(将我的 xml 转换为 ws 理解的内容)和响应(转换为我的系统理解的内容)。
回答by Thorbj?rn Ravn Andersen
You might find the Java Almanac a useful resource.
您可能会发现 Java Almanac 是一个有用的资源。
notably The Quintessential Program That Transforms an XML File with XSL. Example copied from the page (as it keeps disappearing)
特别是使用 XSL 转换 XML 文件的典型程序。从页面复制的示例(因为它不断消失)
import java.io.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
public class BasicXsl {
// This method applies the xslFilename to inFilename and writes
// the output to outFilename.
public static void xsl(String inFilename, String outFilename, String xslFilename) {
try {
// Create transformer factory
TransformerFactory factory = TransformerFactory.newInstance();
// Use the factory to create a template containing the xsl file
Templates template = factory.newTemplates(new StreamSource(
new FileInputStream(xslFilename)));
// Use the template to create a transformer
Transformer xformer = template.newTransformer();
// Prepare the input and output files
Source source = new StreamSource(new FileInputStream(inFilename));
Result result = new StreamResult(new FileOutputStream(outFilename));
// Apply the xsl file to the source file and write the result
// to the output file
xformer.transform(source, result);
} catch (FileNotFoundException e) {
} catch (TransformerConfigurationException e) {
// An error occurred in the XSL file
} catch (TransformerException e) {
// An error occurred while applying the XSL file
// Get location of error in input file
SourceLocator locator = e.getLocator();
int col = locator.getColumnNumber();
int line = locator.getLineNumber();
String publicId = locator.getPublicId();
String systemId = locator.getSystemId();
}
}
}
Sample input:
样本输入:
<?xml version="1.0" encoding="UTF-8"?>
<map>
<entry key="key1" value="value1" />
<entry key="key2" />
</map>
Sample XSLT program:
示例 XSLT 程序:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes"/>
<xsl:template match="map">
<HTML>
<HEAD>
<TITLE>Map</TITLE>
</HEAD>
<BODY>
<xsl:apply-templates/>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="entry">
<xsl:value-of select="@key"/>=<xsl:value-of select="@value"/>
<br></br>
</xsl:template>
</xsl:stylesheet>
The resulting HTML from running the example is:
运行示例的结果 HTML 是:
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>Map</TITLE>
</HEAD>
<BODY>
key1=value1<br>
key2=<br>
</BODY>
</HTML>
回答by Michael Kay
Google for "JAXP tutorial" - there are lots of resources available.
谷歌搜索“JAXP 教程”——有很多可用的资源。
Though if you want to use XSLT 2.0 (and believe me, you do!), you'll be using Saxon, and Saxon offers both JAXP and its own API (called s9api) which helps you take advantage of all the new features in XSLT 2.0.
虽然如果您想使用 XSLT 2.0(相信我,您会这样做!),您将使用 Saxon,并且 Saxon 提供了 JAXP 和它自己的 API(称为 s9api),它可以帮助您利用 XSLT 中的所有新功能2.0.
回答by Kennet
Have a look at http://www.rgagnon.com/javadetails/java-0407.html, hope that answers your question
看看http://www.rgagnon.com/javadetails/java-0407.html,希望能回答你的问题