数据岛提供了一个方便快捷的从HTML页面访问XML数据的方法,由于XSLT(XSL Transformations)本身也是XML语法格式的,所以数据岛也提供了一个载入样式单的方便方式。下面的例子使用二个数据岛来载入XML数据源和XSLT样式单。这两个数据岛使用trabsformNode方法来产生HTML页面内容。
<HTML>
<HEAD>
<TITLE>XSL格式处理的例子</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=gb2312">
</HEAD>
<XML id="source" src="simple.xml"></XML>
<XML id="style" src="simple.xsl"></XML>
<SCRIPT FOR="window" EVENT="onload">
xslTarget.innerHTML = source.transformNode(style.XMLDocument);
</SCRIPT>
<BODY>
<P STYLE="font-size:10pt; font-family:宋体; color:gray">
<B>本例子演示了使用数据岛来载入XML数据源和XSL样式单,并把格式化后的结果插入到页面里的方法。</B>
</P>
<DIV id="xslTarget"></DIV>
</BODY>
</HTML>
当包含数据岛的页面完全载入到浏览器后,onload事件触发,transformNode方法被执行。transformNode方法接收一个参数,此参数是一个Document Object Model (DOM)节点,代表一个样式单。simple.xsl样式单产生的是一个格式良好的HTML,因此可以使用innerHTML属性来显示。
XMLDocument属性作用于“style”数据岛,没有这个属性的话,数据岛的ID(例如:“style”)就会被当作HTML元素的唯一标识来对待,这里是<XML>元素。XMLDocument可以准确地从<XML>元素得到XML DOM Document 节点。使用style.XMLDocument,可以很清楚地得知:你操作的是数据岛的内容,而不是代表数据岛的<XML>元素。
你不必这样书写:source.XMLDocument.transformNode(style.XMLDocument)。如果一个来自XML DOM的方法被应用到数据岛元素,脚本引擎接口就会认为:你是想把这个方法应用到XML DOM节点上,所以,如果使用了另外一个DOM属性或方法,XMLDocument属性就可以省略。这里对于“source”数据岛,由于你正在调用一个DOM方法(transformNode),所以这里不必写出XMLDocument属性。
这里你仍可以写上source.XMLDocument.transformNode(style.XMLDocument),并把样式单应用到文档元素而不是根上,但是样式单里必须反映出这一点。例如:文档元素必须按一定的规则处理,而不能用根模板xsl:template match="/",样式单此时将不会被调用,除非你的样式单是从文档的根开始执行的。我们建议:从根编写你的样式单。
例子:
simple.xml文件
<?xml version="1.0" encoding="gb2312" ?>
<?xml:stylesheet type="text/xsl" href="simple.xsl" ?>
<早餐菜单>
<食物>
<名称>Belgian Waffles</名称>
<价格>$5.95</价格>
<描述>two of our famous Belgian Waffles with plenty of real maple syrup</描述>
<卡路里>650</卡路里>
</食物>
<食物>
<名称>Strawberry Belgian Waffles</名称>
<价格>$7.95</价格>
<描述>light Belgian waffles coverred with strawberrys and whipped cream</描述>
<卡路里>900</卡路里>
</食?gt;
<食物>
<名称>Berry-Berry Belgian Waffles</名称>
<价格>$8.95</价格>
<描述>light Belgian waffles coverred with an assortment of fresh berries and whipped cream</描述>
<卡路里>900</卡路里>
</食物>
<食物>
<名称>French Toast</名称>
<价格>$4.50</价格>
<描述>thick slices made from our homemade sourdough bread</描述>
<卡路里>600</卡路里>
</食物>
<食物>
<名称>Homestyle Breakfast</名称>
<价格>$6.95</价格>
<描述>two eggs, bacon or sausage, toast, and our ever-popular hash browns</描述>
<卡路里>950</卡路里>
</食物>
</早餐菜单>
simple.xsl 文件
<?xml version="1.0" encoding="gb2312" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
</head>
<BODY STYLE="font-family:宋体; font-size:12pt;
background-color:#EEEEEE">
<xsl:for-each select="早餐菜单/食物">
<DIV STYLE="background-color:teal; color:white; padding:4px">
<SPAN STYLE="font-weight:bold; color:white"><xsl:value-of select="名称"/></SPAN>
- <xsl:value-of select="价格"/>
</DIV>
<DIV STYLE="margin-left:20px; margin-bottom:1em; font-size:10pt">
<xsl:value-of select="描述"/>
<SPAN STYLE="font-style:italic">
(<xsl:value-of select="卡路里" />卡路里/份)
</SPAN>
</DIV>
</xsl:for-each>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
点击这里查看结果。
XSL Transformations(XSLT)可以在服务器端进行过滤、自定义XML、改变其样式。也可以利用XML里的内容,并把它们输出到客户端。利用ASP在服务器端执行XSLT与在客户端类似,XML源文件和样式单被载入后,方法transformNode就调用XSLT处理器。也可以用simple.asp 程序在服务器端执行转换,程序如下:
[从此长大]<%@ LANGUAGE = JScript %>
<%
// 设定两文件路径
var sourceFile = Server.MapPath("simple.xml");
var styleFile = Server.MapPath("simple.xsl");
// 载入XML
var source = Server.CreateObject("Msxml2.DOMDocument");
source.async = false;
source.load(sourceFile);// 载入 XSL
var style = Server.CreateObject("Msxml2.DOMDocument");
style.async = false;
style.load(styleFile);Response.Write(source.transformNode(style));;
%>
Server.MapPath方法负责把相对路径转换成全路径。
Server.CreateObject实例化一个新的XML DOM Document对象,转换的结果通过Response.write方法送到客户端。
transformNodeToObject方法提供了把转换的结果直接写到reponse对象的IStream接口的能力。为了应用这种特性,上面程序的最后一行应该换成如下的句子:
source.transformNodeToObject(style, Response);
在大多数的情况下,这种方法在服务器上运行的更好,尤其对于长的文档[它需要较大的内存分配来容纳完整的转换结果]
