在JAVA中转換示例如下:
books.xml
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
books.xsl
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>This is my books</h2>
<table border="1">
<tr>
<th>book title</th>
<th>book author</th>
</tr>
<xsl:for-each select="bookstore/book">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="author"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>This is my books</h2>
<table border="1">
<tr>
<th>book title</th>
<th>book author</th>
</tr>
<xsl:for-each select="bookstore/book">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="author"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
转換JAVA文件:
view plaincopy to clipboardprint?
package com.lwf.test;
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.TransformerFactoryConfigurationError;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
try {
StreamSource xmlSource = new StreamSource("E://workspace_g2//TT//src//books.xml");
StreamSource xsl = new StreamSource("E://workspace_g2//TT//src//books.xsl");
Result outputTarget = new StreamResult("E://workspace_g2//TT//src//bookR.xml");
Transformer ts = TransformerFactory.newInstance().newTransformer(xsl);
ts.transform(xmlSource, outputTarget);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerFactoryConfigurationError e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
package com.lwf.test;
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.TransformerFactoryConfigurationError;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
try {
StreamSource xmlSource = new StreamSource("E://workspace_g2//TT//src//books.xml");
StreamSource xsl = new StreamSource("E://workspace_g2//TT//src//books.xsl");
Result outputTarget = new StreamResult("E://workspace_g2//TT//src//bookR.xml");
Transformer ts = TransformerFactory.newInstance().newTransformer(xsl);
ts.transform(xmlSource, outputTarget);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerFactoryConfigurationError e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
转换后的文件bookR.xml
view plaincopy to clipboardprint?
<html>
<body>
<h2>This is my books</h2>
<table border="1">
<tr>
<th>book title</th><th>book author</th>
</tr>
<tr>
<td>Everyday Italian</td><td>Giada De Laurentiis</td>
</tr>
<tr>
<td>Harry Potter</td><td>J K. Rowling</td>
</tr>
<tr>
<td>XQuery Kick Start</td><td>James McGovern</td>
</tr>
<tr>
<td>Learning XML</td><td>Erik T. Ray</td>
</tr>
</table>
</body>
</html>
<html>
<body>
<h2>This is my books</h2>
<table border="1">
<tr>
<th>book title</th><th>book author</th>
</tr>
<tr>
<td>Everyday Italian</td><td>Giada De Laurentiis</td>
</tr>
<tr>
<td>Harry Potter</td><td>J K. Rowling</td>
</tr>
<tr>
<td>XQuery Kick Start</td><td>James McGovern</td>
</tr>
<tr>
<td>Learning XML</td><td>Erik T. Ray</td>
</tr>
</table>
</body>
</html>
这样在服务器端就将XML经XSL转换了。
服务器端也可将Document类型经xsl文件转换成另一Document代码如下
view plaincopy to clipboardprint?
public static Document generateXMLDOM(
Document tradeDoc,
String xslFile){
Document doc = null;
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(xslFile);
DOMSource source = new DOMSource(document);
Transformer tf = TransformerFactory.newInstance().newTransformer(source);//单线程
// Templates ts = TransformerFactory.newInstance().newTemplates(source);
// Transformer tf = ts.newTransformer();
tf.transform(new DOMSource(tradeDoc), new DOMResult(doc));
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TransformerFactoryConfigurationError e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
return doc;
}
=========================================================================================
XSLT是一种将XML文档转换为其他文本文档的语言,是建立在XML和XPath之上的国际标准,内容比较多,功能强大。
对于编程人员来说,XSLT可以看作以前序遍历的方式专门处理XML树状结构的标记语言。以前编程根据XML文档输出纯文本数据时需要写代码以前序遍历方式的方式遍历XML文档对象组成的树状结构,对于每一个特定名称或特定层次的XML节点而输出不同的内容,这个过程比较复杂,代码量大,需用进行很多的状态判断。而XSLT则使用一种简洁明了的标记语言实现了相同的逻辑。因此XSLT从程序逻辑的角度看类似支持递归的编程语言,而且是专门处理XML文档的。
XSLT转换过程会涉及到三个文本文档,一个是要处理的原始XML文档,第二个就是XSLT样式表文档,该文档包含了XSLT代码,XSLT代码本身就是XML格式,但使用了XML的名称空间。第三个就是XSLT处理输出的文本文档,注意,此处输出的是纯文本文档,这个文档具体是什么格式完全靠XSLT代码来决定,可以是另外一个XML文档,HTML文档,SQL语句字符串或者其他任意格式的字符串数据等等,XSLT转换只能输出纯文本文档,此外就没有限制输出文档的具体格式。
数据XML文档是一个很简单的XML文档,此处不加说明了。重点说说XSLT样式表文档,XSLT样式表文档本身是一个XML文档。它采用XML的树状结构来描述递归处理过程,也比较好理解。
在样式表文档中,根元素为 xsl:stylesheet ,里面定义了一个名为xsl的名称空间,这个根节点及其属性值都是固定的。
xsl:output 元素是可选的,它的method属性用于指定输出文档的格式,可以设置为xml,html或text值。此处使用xml输出样式,说明输出的文档是XML格式的,XSLT转换会尽量生成XML文档,但不作保证,因此仍然有可能生成不合格的XML文档。
xsl:template 用于定义一个XSLT模板,模板类似编程语言中的函数,可实现XSLT代码的重用。模板可以使用name属性定义名称,也可以使用match属性定义匹配的XPath路径,这个模板使用了match属性来匹配XML文档本身。
然后是 html 元素,由于html元素没有使用xsl的前缀,因此不属于xslt代码,因此将原样输出,跟着后面的body,table元素也是一样的。
xsl:for-each 元素类似C#中的foreach 语法结果,表示循环遍历元素,它使用select属性指定一个XPath相对路径,XSLT使用这个相对路径查询所有要遍历的XML节点,此时当前节点就是XML文档本身,因此XSLT处理器会调用XmlDocument的SelectNodes 函数来获得要遍历的XML节点,函数的参数就是Table/Record。于是我们开始循环遍历所有的Record元素了。
在循环遍历Record元素时,对每一个Record元素都要输出xsl:for-each的子节点,首先是 tr 元素,这不是XSLT元素,因此原样输出。这里还套嵌定义了另外一个for-each元素,于是我们又开始了一个新的循环遍历了,新的循环指定的相对XPath路径是一个星号,表示匹配所有名称的子元素,这类似DOS命令Dir中使用星号匹配所有文件。此处表示循环遍历Record元素下面所有的字段元素。
对每一个字段元素,首先输出td 元素,然后处理xsl:value-of 元素,xsl:value-of 表示输出指定相对路径的节点的值,这里指定的XPath是一个点号,表示当前节点本身,由于当前节点是XML元素,因此也就输出元素的文本内容,相当于输出XmlElement的InnerText 属性值。
xslt文件:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:template match="/">
<xsl:for-each select="Category">
<Category>
<xsl:attribute name="Navigate">
<xsl:value-of select="@Navigate"/>
</xsl:attribute>
<xsl:element name="Name">
<xsl:value-of select="Name"/>
</xsl:element>
<xsl:element name="EngName">
<xsl:value-of select="EngName"/>
</xsl:element>
<xsl:element name="ChtName">
<xsl:value-of select="ChtName"/>
</xsl:element>
<xsl:element name="Description">
<xsl:value-of select="Description"/>
</xsl:element>
<xsl:element name="EngDescription">
<xsl:value-of select="EngDescription"/>
</xsl:element>
<xsl:element name="ChtDescription">
<xsl:value-of select="ChtDescription"/>
</xsl:element>
<xsl:element name="Editor">
<xsl:value-of select="Editor"/>
</xsl:element>
<xsl:element name="LastModified">
<xsl:value-of select="LastModified"/>
</xsl:element>
<xsl:element name="Identity">
<xsl:text>CAT_ZTF</xsl:text>
</xsl:element>
<xsl:element name="Notes">
<xsl:value-of select="Notes"/>
</xsl:element>
<xsl:element name="TotalCount">
<xsl:text>{0}</xsl:text>
</xsl:element>
<xsl:for-each select="Content">
<xsl:for-each select="CatItem">
<xsl:element name="CatItem">
<xsl:attribute name="Name">
<xsl:value-of select="@Name"/>
</xsl:attribute>
<xsl:attribute name="Code">
<xsl:value-of select="@Code"/>
</xsl:attribute>
<xsl:attribute name="ParentCode">
<xsl:value-of select="@ParentCode"/>
</xsl:attribute>
<xsl:attribute name="CategoryType">
<xsl:text>CAT_ZTF</xsl:text>
</xsl:attribute>
</xsl:element>
</xsl:for-each>
</xsl:for-each>
</Category>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
原XML文件:
<?xml version="1.0" encoding="GB2312"?>
<Category Navigate="1">
<Name>专用分类</Name>
<EngName>New</EngName>
<ChtName>專用分類</ChtName>
<Description/>
<EngDescription/>
<ChtDescription/>
<Editor>Liangying</Editor>
<LastModified>2010-5-31</LastModified>
<Identity>CAT_XXXX</Identity>
<Notes>专用分类</Notes>
<Content Count="97">
<CatItem Name="文艺" Description="" EngDescription="" ChtDescription="" Code="001" ParentCode="" Nav="tttt?={0}"/>
<CatItem Name="小说" Description="" EngDescription="" ChtDescription="" Code="001001" ParentCode="001" Nav="tttt?={0}"/>
<CatItem Name="文学" Description="" EngDescription="" ChtDescription="" Code="001002" ParentCode="001" Nav="tttt?={0}"/>
<CatItem Name="散文" Description="" EngDescription="" ChtDescription="" Code="001003" ParentCode="001" Nav="tttt?={0}"/>
</Content>
</Category>