- 浏览: 83892 次
- 性别:
- 来自: 北京
使用可扩展样式表语言转换(Extensible Stylesheet Language Transformation(XSLT))通常是将 XML 数据从一种形式转换成另一种形式的最方便的方法,因为它使您具有很大的灵活性,而不必更改应用程序。然而,有时您可能会遇到意外困难,因为要使用的样式表是基于文档本身的内容来决定的。本篇技巧文章讨论了两种使您可以基于 XML 文档来选择样式表的方法 — 样式表处理指令和数据本身。
本篇技巧文章使用 Apache 项目中的 JAXP 和 Xalan-Java。这些类也是 Java 2 SDK 1.4 的一部分,因此,如果您安装了 1.4,那么就不需要任何附加软件。
转换文档
转换文档的过程包括使用样式表作为其基础来创建一个 Transformer 对象、设置源文档和结果文档以及执行转换。在其最简单的形式中,它类似于清单 1. 执行转换中的代码。
清单 1. 执行转换
import java.io.File;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
public class ChooseStyleSheet {
public static void main (String args[]) {
try {
TransformerFactory transformerFactory =
TransformerFactory.newInstance();
StreamSource source = new StreamSource("scores.xml");
StreamResult result = new StreamResult("result.xml");
StreamSource style = new StreamSource("scores.xsl");
Transformer transformer =
transformerFactory.newTransformer(style);
transformer.transform(source, result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
关联样式表
表明文档的 XML 样式表的最简单方法是添加样式表处理指令并将样式表与文档关联。在本例中,只要将一行添加到源文档(请参阅清单 2. 添加处理指令的样式表)。
清单 2. 添加处理指令的样式表
<?xml version="1.0"?>
<?xml-stylesheet href="scores.xsl" type="text/xsl"?>
<results showName="New Port Richey Open" location="New Port Richey, FL" showDate="7/31/01">
...
</results>
从这里,应用程序可以通过使用 TransformerFactory 的 getAssociatedStyleSheet() 方法(如清单 3. 获取关联的样式表所示)来检索信息。
清单 3. 获取关联的样式表所示
import java.io.File;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.Source;
public class ChooseStyleSheet {
public static void main (String args[]) {
try {
TransformerFactory transformerFactory =
TransformerFactory.newInstance();
StreamSource source = new StreamSource("scores.xml");
StreamResult result = new StreamResult("result.xml");
Source style = transformerFactory
.getAssociatedStylesheet(source, null, null, null);
Transformer transformer =
transformerFactory.newTransformer(style);
transformer.transform(source, result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
请注意,该方法实际上有四个参数。其定义为:
getAssociatedStylesheet(Source source,
java.lang.String media,
java.lang.String title,
java.lang.String charset)
这允许您根据媒体、标题和字符集选择样式表。例如,XML 文档读上去可能象清单 4. 多个样式表。
清单 4. 多个样式表
<?xml version="1.0"?>
<?xml-stylesheet href="scores.xsl" type="text/xsl"?>
<?xml-stylesheet href="scores_wap.xsl" type="text/xsl" media="phone"?>
<?xml-stylesheet href="scores_print.xsl" type="text/xsl" media="print"?>
<results showName="New Port Richey Open" location="New Port Richey, FL" showDate="7/31/01">
...
</results>
通过这种方法,可以对应用程序进行特别地选择,例如,印刷版本(请参阅清单 5. 选择特定媒体)。
清单 5. 选择特定媒体
...
StreamSource source = new StreamSource("scores.xml");
StreamResult result = new StreamResult("result.xml");
Source style = transformerFactory
.getAssociatedStylesheet(source, "print", null, null);
Transformer transformer =
transformerFactory.newTransformer(style);
...
根据数据选择样式表
另一方面,您可能想要根据文档中的数据精确地选择样式表。在这种情况下,首先要解析文档并直接检索数据,然后使用数据来确定样式表。
例如,考虑一个处理多页并根据根元素名称选择样式表的应用程序。精确地转换文件包括解析文档,然后确定根元素名称,如清单 6. 解析文档中所示。
清单 6. 解析文档
import java.io.File;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.Source;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class ChooseStyleSheet {
public static void main (String args[]) {
String rootName = null;
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse("scores.xml");
Element root = doc.getDocumentElement();
rootName = root.getNodeName();
} catch (Exception e) {
e.printStackTrace();
}
try {
TransformerFactory transformerFactory =
TransformerFactory.newInstance();
StreamSource source = new StreamSource("scores.xml");
StreamResult result = new StreamResult("result.xml");
String styleName = null;
if (rootName.equals("results")){
styleName = "scores.xsl";
} else if (rootName.equals("entries")){
styleName = "entries.xsl";
}
Transformer transformer = null;
if (styleName == null) {
transformer = transformerFactory.newTransformer();
} else {
StreamSource style = new StreamSource(styleName);
transformer = transformerFactory.newTransformer(style);
}
transformer.transform(source, result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
这里的操作有两个主要步骤。首先,解析文档并获取根元素的名称,将该名称作为一个 String 值传入第二个 try-catch 块中。
在第二个 try-catch 块中,确定新样式表将是什么。该示例仅显示两个选项,如果根元素不是这两个选项之一,那么样式表名保持为 null。
从这里,是创建实际 Transformer 对象的事情。如果选择了样式表,显然应该将它用于创建 style Source,然后把该 Source 传递给 newTransformer() 方法以创建 Transformer 对象。反之,如果没有做任何选择,则您可以选择创建不带样式表的 Transformer 对象。这样做的结果是只传递源文档而源文档不会改变。
后继步骤
本篇技巧文章演示了使用 XML 文档中的数据确定要处理的样式表的简单方法。您可以扩充该原理以包括从其它资源(如数据库)中汲取的信息来确定样式表。要使工作更进一步,可以使用 XML 文档中的信息来设置样式表中的参数,或者甚至实时创建一个样式表并使用它来转换原始文档。
参考资料
通过单击本文顶部或底部的讨论,参与有关本文的论坛。
请参考 W3C 的 XSLT 2.0 规范工作草案。
下载 JAXP 或 Xalan-Java。
请在 developerWorks XML 专区上查找更多 XML 的参考资料。
请查看 IBM WebSphere Studio Application Developer,它是构建、测试和部署 Java Server Pages、servlet 和与 XML 相关的应用程序和网站的一种易于使用的集成开发环境。
本篇技巧文章使用 Apache 项目中的 JAXP 和 Xalan-Java。这些类也是 Java 2 SDK 1.4 的一部分,因此,如果您安装了 1.4,那么就不需要任何附加软件。
转换文档
转换文档的过程包括使用样式表作为其基础来创建一个 Transformer 对象、设置源文档和结果文档以及执行转换。在其最简单的形式中,它类似于清单 1. 执行转换中的代码。
清单 1. 执行转换
import java.io.File;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
public class ChooseStyleSheet {
public static void main (String args[]) {
try {
TransformerFactory transformerFactory =
TransformerFactory.newInstance();
StreamSource source = new StreamSource("scores.xml");
StreamResult result = new StreamResult("result.xml");
StreamSource style = new StreamSource("scores.xsl");
Transformer transformer =
transformerFactory.newTransformer(style);
transformer.transform(source, result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
关联样式表
表明文档的 XML 样式表的最简单方法是添加样式表处理指令并将样式表与文档关联。在本例中,只要将一行添加到源文档(请参阅清单 2. 添加处理指令的样式表)。
清单 2. 添加处理指令的样式表
<?xml version="1.0"?>
<?xml-stylesheet href="scores.xsl" type="text/xsl"?>
<results showName="New Port Richey Open" location="New Port Richey, FL" showDate="7/31/01">
...
</results>
从这里,应用程序可以通过使用 TransformerFactory 的 getAssociatedStyleSheet() 方法(如清单 3. 获取关联的样式表所示)来检索信息。
清单 3. 获取关联的样式表所示
import java.io.File;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.Source;
public class ChooseStyleSheet {
public static void main (String args[]) {
try {
TransformerFactory transformerFactory =
TransformerFactory.newInstance();
StreamSource source = new StreamSource("scores.xml");
StreamResult result = new StreamResult("result.xml");
Source style = transformerFactory
.getAssociatedStylesheet(source, null, null, null);
Transformer transformer =
transformerFactory.newTransformer(style);
transformer.transform(source, result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
请注意,该方法实际上有四个参数。其定义为:
getAssociatedStylesheet(Source source,
java.lang.String media,
java.lang.String title,
java.lang.String charset)
这允许您根据媒体、标题和字符集选择样式表。例如,XML 文档读上去可能象清单 4. 多个样式表。
清单 4. 多个样式表
<?xml version="1.0"?>
<?xml-stylesheet href="scores.xsl" type="text/xsl"?>
<?xml-stylesheet href="scores_wap.xsl" type="text/xsl" media="phone"?>
<?xml-stylesheet href="scores_print.xsl" type="text/xsl" media="print"?>
<results showName="New Port Richey Open" location="New Port Richey, FL" showDate="7/31/01">
...
</results>
通过这种方法,可以对应用程序进行特别地选择,例如,印刷版本(请参阅清单 5. 选择特定媒体)。
清单 5. 选择特定媒体
...
StreamSource source = new StreamSource("scores.xml");
StreamResult result = new StreamResult("result.xml");
Source style = transformerFactory
.getAssociatedStylesheet(source, "print", null, null);
Transformer transformer =
transformerFactory.newTransformer(style);
...
根据数据选择样式表
另一方面,您可能想要根据文档中的数据精确地选择样式表。在这种情况下,首先要解析文档并直接检索数据,然后使用数据来确定样式表。
例如,考虑一个处理多页并根据根元素名称选择样式表的应用程序。精确地转换文件包括解析文档,然后确定根元素名称,如清单 6. 解析文档中所示。
清单 6. 解析文档
import java.io.File;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.Source;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class ChooseStyleSheet {
public static void main (String args[]) {
String rootName = null;
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse("scores.xml");
Element root = doc.getDocumentElement();
rootName = root.getNodeName();
} catch (Exception e) {
e.printStackTrace();
}
try {
TransformerFactory transformerFactory =
TransformerFactory.newInstance();
StreamSource source = new StreamSource("scores.xml");
StreamResult result = new StreamResult("result.xml");
String styleName = null;
if (rootName.equals("results")){
styleName = "scores.xsl";
} else if (rootName.equals("entries")){
styleName = "entries.xsl";
}
Transformer transformer = null;
if (styleName == null) {
transformer = transformerFactory.newTransformer();
} else {
StreamSource style = new StreamSource(styleName);
transformer = transformerFactory.newTransformer(style);
}
transformer.transform(source, result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
这里的操作有两个主要步骤。首先,解析文档并获取根元素的名称,将该名称作为一个 String 值传入第二个 try-catch 块中。
在第二个 try-catch 块中,确定新样式表将是什么。该示例仅显示两个选项,如果根元素不是这两个选项之一,那么样式表名保持为 null。
从这里,是创建实际 Transformer 对象的事情。如果选择了样式表,显然应该将它用于创建 style Source,然后把该 Source 传递给 newTransformer() 方法以创建 Transformer 对象。反之,如果没有做任何选择,则您可以选择创建不带样式表的 Transformer 对象。这样做的结果是只传递源文档而源文档不会改变。
后继步骤
本篇技巧文章演示了使用 XML 文档中的数据确定要处理的样式表的简单方法。您可以扩充该原理以包括从其它资源(如数据库)中汲取的信息来确定样式表。要使工作更进一步,可以使用 XML 文档中的信息来设置样式表中的参数,或者甚至实时创建一个样式表并使用它来转换原始文档。
参考资料
通过单击本文顶部或底部的讨论,参与有关本文的论坛。
请参考 W3C 的 XSLT 2.0 规范工作草案。
下载 JAXP 或 Xalan-Java。
请在 developerWorks XML 专区上查找更多 XML 的参考资料。
请查看 IBM WebSphere Studio Application Developer,它是构建、测试和部署 Java Server Pages、servlet 和与 XML 相关的应用程序和网站的一种易于使用的集成开发环境。
发表评论
-
敏捷软件开发
2016-08-19 16:32 334敏捷软件开发 敏捷软件开发是一种面临迅速变化的需求快速开 ... -
XML 系列教程
2012-05-06 12:50 612http://www.w3school.com.cn/x.as ... -
MANIFEST.MF是个啥?请给俺个详细解答
2012-02-06 17:48 1052看完下面的帖子你就明 ... -
如何从IT民工跃身成精英
2011-12-19 15:11 804“IT”这个英文缩写 ... -
java_ant详解(转载)
2011-12-17 14:40 12571,什么是ant ant是构建工具 2,什么是构建 概念到处可 ... -
Log4j使用总结
2011-12-14 16:10 1一、介绍 Log4j是Apache的一个开放源代码项目,通过 ... -
Log4j使用总结(转)
2011-12-14 16:08 699一、介绍 Log4j是Apache的一个开放源代码项目,通过 ... -
关于正则表达式的贪婪与非贪婪模式
2011-11-20 15:42 1147以前看正则表达式,但没有注意到正则表达式的贪婪与非贪婪模式,今 ... -
MyEclipse内存不足以及参数配置“ -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M ”
2011-11-19 20:20 2536“MyEclipse has detected that ... -
eclipse中的.project 和 .classpath文件的具体作用 (转)
2011-03-10 15:27 1245.project是项目文件,项目的结构都在其中定义,比如lib ... -
Xpath使用(转载)
2010-08-17 18:38 1086XPath 表达式比繁琐的文档对象模型(DOM)导航代码要容易 ... -
XPath简介(转载)
2010-08-17 18:30 894XPath 简介Previous Page Next Page ... -
XSL简介(转载)
2010-08-17 17:35 963XSL 语言 Previous Page Next Page ... -
JUnit测试框架使用介绍
2010-08-13 13:35 853JUnit测试骨架 使用JUnit时,主要都是通过继承Test ... -
EasyMock使用手记
2010-08-12 11:45 908Mock 对象能够模拟领域 ... -
EasyMock 使用方法与原理剖析
2010-08-11 18:23 821Mock 方法是单元测试中 ... -
JUNIT入门
2010-08-11 15:32 1082关键字: junit test 1、将junit的jar包放 ...
相关推荐
在本案例中,提供的"**xsl2xml.java**"文件可能是一个Java程序,它实现了将XML文件根据XSL样式表转换的功能。Java中处理XML和XSLT转换通常会用到如`javax.xml.transform`这样的API,其中`TransformerFactory`用于...
通过XSL解析XML在浏览器中显示树的XSL样式表。 处理简便,功能强大,支持拖放,支持键盘操作,每个结点可显示不同的图标,刷新时可以自动记录结点状态,可灵活处理点击动作。 <br>注:本样式表为同步加载模式...
另一方面,XSL(Extensible Stylesheet Language)是用来转换XML文档的样式表语言,尤其是XSLT(XSL Transformations),它是XSL的一部分,专门用于将XML数据转换成其他格式,如HTML、PDF或简单的文本。 XML转换XSL...
主要实现了基于XML的同学录,根据XML文档,用DTD检验及保证其有效性,使其结构完整良好,编写xsl文档,使其按照规定的样表显示,并运用XPath、Xlink、Xpointer等实现向HTML的转换,最后显示在浏览器上。直观,简单,...
jmeter extras里提供了一些xsl样式表,但是不方便看细节,这个样式表转自,可以看细节报告
3. **XML与XSL(可扩展样式表语言)** XSL是一种更强大的工具,不仅处理样式,还能转换XML数据。XSLT(XSL转换)允许我们定义一套规则,将XML数据转换成其他格式,如HTML、PDF或新的XML文档。以下是一个简单的XSL...
"XML+xsl讲XML文档的内容用xsl建表"的主题意味着我们将学习如何使用XSLT将XML文档的内容转换成表格形式。这通常涉及到以下步骤: 1. **理解XML结构**:首先,需要熟悉XML文档的结构和元素关系,以便确定如何在表格...
XML(可扩展标记语言)和XSL(可扩展样式表语言)是Web开发中的核心技术,它们主要用于数据的结构化表示和格式化展示。XML是一种标记语言,它允许开发者定义自己的标签来描述数据,使得数据更加结构化,易于解析和...
标题中的“用xml.xsl 写的课程表”指的是使用XML(可扩展标记语言)和XSL(可扩展样式表语言)技术创建的课程表应用。XML是一种用于标记数据的语言,它允许数据以结构化的方式表示,而XSL则是一种转换XML文档的样式...
在开发过程中,`test.xml`和`test.xsl`的配合使用可以帮助开发者分离数据内容和显示样式,使得数据的管理和界面设计更加灵活。这种模式在大型项目中尤其有用,因为可以由不同的团队分别处理数据逻辑和界面样式。 ...
XSL(Extensible Stylesheet Language)是一种用于转换XML文档的样式表语言,它为XML数据提供了强大的格式化和转换能力。XSL的主要任务是将XML数据转换成其他形式,如HTML、PDF或纯文本,以适应不同的展示需求。在...
XSL(可扩展样式表语言)则是用来转换XML文档的样式和布局的语言。在本案例中,我们将探讨如何使用纯HTML标签静态调用XML文件,并利用XSL进行显示修饰,不依赖JavaScript等脚本语言。 首先,让我们了解HTML如何静态...
标题中的“xml+xsl”指的是XML(可扩展标记语言)与XSL(可扩展样式表语言)的结合使用。XML是一种用于标记数据的语言,而XSL则是一种用于转换和呈现XML文档的语言。这两种技术在处理结构化数据和网页布局方面扮演着...
xml+xsl分页原理:在xsl中,遍历节点的时候,可以获取当前节点的位置,而且还能限制显示特定位置的节点,例如有18条记录,可以在xsl中设置只显示第1-6条,也可以设置只显示第7-12条,再配合客户端脚本,就可以动态...
XSL是一种样式表语言,用于转换XML文档的结构和格式。 首先,我们来看XML解析。在JavaScript中,可以使用DOMParser对象来解析XML字符串,将其转化为DOM(Document Object Model)树,然后通过DOM API遍历和操作XML...
2. **编写XSLT样式表**:接下来,你需要编写一个XSLT样式表,这个样式表定义了XML数据如何被转换成XSL-FO格式。XSLT模板会匹配XML文档中的元素,并生成相应的XSL-FO元素。 3. **应用XSLT转换**:使用XSLT处理器(如...
XSL(Extensible Stylesheet Language)是一种样式表语言,用于转换XML文档。XSLT(XSL Transformations)是XSL的一部分,专门用于XML到XML、XML到HTML、XML到文本的转换。XSLT通过模板匹配和流控制来改变XML文档的...
XSL(可扩展样式表语言)是一种用于转换XML文档的语言。在这个项目中,XSLT(XSL的转换部分)被用来将原始的XML简历数据转换成HTML或其他格式,以便于在网页上展示或者适应不同的输出需求。XSLT允许我们定义规则,...
1.xml文件很可能是包含结构化数据的XML文档,而1.xsl文件则是定义了如何将XML数据转换和展示的样式表。通过XSLT,1.xsl会根据其规则对1.xml进行解析,生成一个新的结构或样式,这可能是用于网页展示的HTML。 XSLT的...
通过这些电子书和网页,学习者可以期望深入理解XML和XSL的基本概念,掌握如何创建XML文档,编写XSL样式表,并运用XSLT进行数据转换。同时,可能会涉及到与服务器端脚本结合使用XML和XSLT的实际案例,这对于开发动态...