`
369128396
  • 浏览: 80869 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

根据XML内容设置XSL样式表(转载)

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

相关推荐

    jmeter xsl样式表

    jmeter extras里提供了一些xsl样式表,但是不方便看细节,这个样式表转自,可以看细节报告

    用XML+XSL生成WEB树的XSL样式表

    通过XSL解析XML在浏览器中显示树的XSL样式表。 处理简便,功能强大,支持拖放,支持键盘操作,每个结点可显示不同的图标,刷新时可以自动记录结点状态,可灵活处理点击动作。 &lt;br&gt;注:本样式表为同步加载模式...

    基于XML的同学录(xsl样式表)

    主要实现了基于XML的同学录,根据XML文档,用DTD检验及保证其有效性,使其结构完整良好,编写xsl文档,使其按照规定的样表显示,并运用XPath、Xlink、Xpointer等实现向HTML的转换,最后显示在浏览器上。直观,简单,...

    xml根据xsl转换

    在开发过程中,遇到事先定义好的样式文件与xml文件内容转换,将xml文件按照样式文件进行输出.

    XML+xsl讲XML文档的内容用xsl建表

    XML+xsl讲XML文档的内容用xsl建表。

    用xml.xsl 写的课程表

    通过xml和xsl写的课程表,通过点击课程表可以查看该课程的任课教师和分数

    JSON解析xml 带xsl样式

    JSON解析xml 带xsl样式,有多个实例,可自行学习

    xml_popup.rar_javascript xml_xml xsl_xsl_xsl javascript

    xml+xsl分页原理:在xsl中,遍历节点的时候,可以获取当前节点的位置,而且还能限制显示特定位置的节点,例如有18条记录,可以在xsl中设置只显示第1-6条,也可以设置只显示第7-12条,再配合客户端脚本,就可以动态...

    XML与CSS、XML与XSL及在页面中直接调用XML的数据

    主要实现的是XML与CSS、XML与XSL及在页面中直接调用XML的数据,原理很简单。

    xml+xsl+css生成制作html网页

    xml+xsl+css html网页 xml+xsl+css html网页 xml+xsl+css html网页 xml+xsl+css html网页 xml+xsl+css html网页 xml+xsl+css html网页

    简单的xml与xsl实例

    简单的xml与xsl实例简单的xml与xsl实例简单的xml与xsl实例简单的xml与xsl实例简单的xml与xsl实例

    XML HTML CSS XSL Web编程实作教程.rar

    XML HTML CSS XSL Web编程实作教程.rar XML HTML CSS XSL Web编程实作教程.rar XML HTML CSS XSL Web编程实作教程.rar

    XML技术教学大纲

    通过本课程的学习,使学生掌握XML应用基础知识,具备使用XML开发Web站点必备的基础知识、在XML中如何使用DTD,XML Schema知识、XML样式表、使用CSS格式格式化XML,XSL样式表,名称空间、XML DOM与XPath,以及XML的...

    Xsl与xml结合Xsl与xml结合

    Xsl与xml结合Xsl与xml结合Xsl与xml结合Xsl与xml结合Xsl与xml结合

    XSL基础教程 从 XSLT 样式表调用 JavaScript

    XSL基础教程 从XSLT样式表调用 JavaScript XSLT 是什么类型的语言 XML认证教程,第 4 部分 XSL样式单

    xml和xsl的练习例子

    xml和xsl的练习例子xml和xsl的练习例子xml和xsl的练习例子xml和xsl的练习例子xml和xsl的练习例子xml和xsl的练习例子

    XML HTML CSS XSL Web编程实作

    XML HTML CSS XSL Web编程实作

    xml xsl网页生成

    xml xsl网页生成,一个很小的测试demo,供大家学习

    利用XSL和ASP实现XML文档在线编辑

    本文通过一个详细的例子,来阐述了在线编辑XML文档数据的方法。...本文的例子就是利用XSL样式单把XML文档显示出来,供用户进行编辑,然后再把编辑后的数据提交到服务器,在服务器端进行数据的更新。

    XSL转换XML的技术

    根据下列学生信息表,设计文件名为student.xml的XML文档,编写文件名为student1.xsl的XSL文件。要求以表格的形式输出学号、专业、姓名、性别、民族、出生日期和联系方式,各单元格内居中显示。 3.3 XSL转换XML文档...

Global site tag (gtag.js) - Google Analytics