`
小嘴冰凉
  • 浏览: 455930 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

技巧:根据XML内容设置XSL样式表

阅读更多
技巧:根据XML内容设置XSL样式表



Nicholas Chase(nicholas@nicholaschase.com)

总裁,Chase & Chase, Inc.

2002 年 5 月

使用可扩展样式表语言转换(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 相关的应用程序和网站的一种易于使用的集成开发环境。

关于作者

Nicholas Chase 参与了很多公司(如 Lucent Technologies、Sun Microsystems、Oracle 和 Tampa Bay Buccaneers 等)的网站开发。Nick 曾是一名高中物理教师、低辐射废物设备管理人员、在线科幻小说杂志编辑、多媒体工程师和 Oracle 讲师。最近,他成为 Site Dynamics Interactive Communications(位于佛罗里达州克利尔沃特市)的首席技术官,而且还是三本有关 Web 开发书籍的作者,包括 Java and XML From Scratch (Que) 和即将出版的 Primer Plus XML Programming (Sams)。他乐于听取读者的意见,可以通过 nicholas@nicholaschase.com 与他联系。

分享到:
评论

相关推荐

    用 xsl essage 调试样式表

    清单2展示了如何在DocBook XSL样式表中添加调试消息,以确定转换无效的原因: 清单2: ```xml &lt;xsl:choose&gt; &lt;xsl:when test="caption"&gt; &lt;xsl:message&gt;CAPTION!&lt;/xsl:message&gt; &lt;!-- ... --&gt; &lt;/xsl:when&gt; &lt;!-- ...

    跟我学XSL电子资源下载

    6. **样式表结构**:探讨如何组织XSL样式表,包括导入和包含其他样式表的机制。 7. **转换过程**:阐述XML到HTML、SVG或其他格式的转换流程,以及如何控制输出结果的样式和布局。 8. **实际应用**:通过实例演示...

    xml与xsl的小实例

    1.xml文件很可能是包含结构化数据的XML文档,而1.xsl文件则是定义了如何将XML数据转换和展示的样式表。通过XSLT,1.xsl会根据其规则对1.xml进行解析,生成一个新的结构或样式,这可能是用于网页展示的HTML。 XSLT的...

    xsl的实例.rar_Table_XsL table_xsl

    3. **调用XSL转换**:在XML文档和XSL样式表准备好后,可以通过JavaScript、服务器端脚本或者XML解析器来执行XSL转换。这个过程会生成一个新的HTML文档,其中包含根据XML数据创建的表格。 4. **展示结果**:最后,...

    跟我学xsl.doc

    实践是最好的老师,尝试编写自己的XSL样式表,将XML数据转换成所需格式,是巩固理论知识的绝佳方式。 总结,XSL作为XML的重要伴侣,提供了一种强大的方式来管理和展示XML数据。从基础概念到高级技巧,掌握XSL能帮助...

    XSL学习3

    4. **xsl**:这个文件名可能表示一个XSL样式表文件,其中包含了实际的XSL代码。读者可以分析这个示例文件来学习如何在实际场景中应用XSL进行数据转换。 综合这些资源,学习者可以系统地了解和掌握XSL,从基础概念到...

    XSLT将XML装换为XHTML(带源码)

    这将使用Saxon XSLT处理器,输入为`input.xml`,样式表为`transform.xsl`,输出为`output.xhtml`。 转换后的XHTML文件可以被现代浏览器解析并显示,这样XML数据就以更友好的方式呈现给了用户。值得注意的是,XHTML...

    xsl学习的相关资料收集

    XSL(Extensible Stylesheet Language)是一门强大的样式表语言,用于转换XML(Extensible Markup Language)文档。它由三个核心部分组成:XSLT(XSL Transformations)、XPath(XML Path Language)以及XSL-FO(XSL...

    XSL 官方文档

    XSL(Extensible Stylesheet Language)是一种样式表语言,用于转换XML(Extensible Markup Language)文档。它由三个主要部分组成:XPath(XML Path Language),XSLT(XSL Transformations),以及XSL-FO(XSL ...

    在XSL使用数组例子

    XSL,全称为eXtensible Stylesheet Language,是一种用于转换XML文档的样式表语言。在处理XML数据时,有时我们需要使用数组(Array)的概念来存储和操作一系列相关的数据。虽然XSL自身并不直接支持数组,但我们可以...

    (清华大学)XML实践教程

    - **XSLT (XSL Transformations)**:转换XML文档的样式表语言,将XML转换成HTML、PDF或其他格式。 5. **DOM (Document Object Model) 和 SAX (Simple API for XML)** - **DOM**:将XML文档解析为树形结构,允许...

    商业编程-源码-用XML和XSLT进行高级的 Web UI设计(二).zip

    XML是一种用于存储和传输数据的语言,而XSLT则是一种专门用于转换XML文档格式的样式表语言。下面将详细介绍这两个技术以及它们在Web UI设计中的作用。 XML(可扩展标记语言): XML设计的初衷是为了提供一种结构化...

    xml基础学习完全手册

    7. **XSLT**:XSL转换(XSL Transformations)是一种用于转换XML文档的样式表语言。XSLT可以将XML文档转换成HTML、PDF或其他XML格式,或者进行数据提取和处理。 8. **DOM解析**:Document Object Model (DOM)是XML...

    xml高级编程的电子书上

    - **XSL(eXtensible Stylesheet Language)**:用于转换XML文档,通过XSLT样式表实现XML到XML、XML到HTML或其他格式的转换。 - **模板匹配**:XSLT通过模式匹配选择要转换的XML元素。 - **变量和函数**:XSLT...

    XSL练习小试

    其次,`CodeCC.xslt` 是一个XSL样式表文件。它的作用是定义一系列规则,用于将`CodeCC.xml`中的数据转换为另一种格式。XSLT由一系列的模板和规则组成,当应用到XML文件时,会根据这些规则对XML元素进行匹配和转换。...

    XML编程大全PDF

    书中会详细解释XSLT的工作原理,以及如何编写XSL样式表进行转换。 6. **DOM(Document Object Model)与SAX(Simple API for XML)解析器**:这两种解析方式用于读取和处理XML文档。DOM将整个XML文档加载到内存中,...

    XSL学习资料

    理解这些内容对于编写高效且可维护的XSLT样式表至关重要。 3. **XSLT标准参考手册.chw** 这可能是手册的另一种格式,可能更适合某些阅读软件。chw文件是Windows的帮助文件格式,通常包含索引、搜索和导航功能,...

    xml大全

    - XSLT(XSL转换):用于转换XML文档的样式表语言,可以将XML转换为HTML、PDF或其他XML格式。 XML在IT行业的应用: 1. 数据交换:XML常用于不同系统之间的数据交换,如Web服务(SOAP)、RESTful API。 2. 配置文件...

    XML高级编程pdf-23

    定义一组模板,这些模板在样式表中具有特定的作用域。 8. **xsl:element** 创建一个新的元素节点,name属性指定了新元素的名称。 9. **xsl:entity-ref** 创建实体引用节点,name属性指定了引用的实体名称。 ...

Global site tag (gtag.js) - Google Analytics