将上例的XML文档用XSL样式转换为HTML文档的步骤是:先用XML解释器将XML文档 解释成DOM对象,相当于建立了原文档的一个节点树。然后用XML解释器解释XSL文 档,用模板匹配的方法去遍历XML节点树,将树中的节点按模板的设定转换为模板指 示的显示语言,即HTML语言。至于具体的转换过程,既可以在服务器端进行,也可以在客户端进行,XSLT 的设计目标之一是使数据在服务器上从一种格式转换到另一种格式成为可能,并向所有类型的浏览器返回可读的数据。
XSL 包括三部分:(XSL 可描述如何来显示 XML 文档!CSS = HTML 样式表 XSL = XML 样式表)
XSLT 一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言
XPath 一种用于在 XML 文档中导航的语言。
XSL-FO 一种用于格式化 XML 文档的语言。可描述输出到屏幕、纸媒介或者其他媒介的 XML 数据的格式。是带有关于输出布局以及输出内容的信息的 XML 文件。
XSLT 使用 XPath 在 XML 文档中查找信息。XPath 被用来通过元素和属性在 XML 文档中进行导航。
xslt的支持和浏览器有很大关系
声明 XSL 样式表
由于 XSL 样式表本身也是一个 XML 文档,因此它总是由 XML 声明起始:<?xml version="1.0" encoding="ISO-8859-1"?>然后
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">或者
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
把 XSL 样式表链接到 XML 文档
例如在xml文档中加入<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
xsl:template元素
XSL 样式表由一个或多套被称为模板(template)的规则组成。
每个模板含有当某个指定的节点被匹配时所应用的规则。
match 属性用于关联 XML 元素和模板。match 属性也可用来为整个文档定义模板。match 属性的值是 XPath 表达式(举例,match="/" 定义整个文档)
xsl:value-of元素
用于提取某个选定节点的值,并把值添加到转换的输出流中,select 属性的值是一个 XPath 表达式。此表达式的工作方式类似于定位某个文件系统,在其中正斜杠可选择子目录。
xsl:for-each元素
用于选取指定的节点集中的每个 XML 元素。
通过在 <xsl:for-each> 元素中添加一个选择属性的判别式,我们也可以过滤从 XML 文件输出的结果。
<xsl:for-each select="catalog/cd[artist='Bob Dylan']
">
合法的过滤运算符:= (等于) != (不等于) < (小于) > (大于)
xsl:sort元素
用于对结果进行排序,如需对结果进行排序,只要简单地在 XSL 文件中的 <xsl:for-each> 元素内部添加一个 <xsl:sort> 元素:select 属性指示需要排序的 XML 元素
xsl:if元素
针对 XML 文件内容的条件测试。
<xsl:if test="expression"> ...如果条件成立则输出... </xsl:if>
如需添加有条件的测试,请在 XSL 文件中的 <xsl:for-each> 元素内部添加 <xsl:if> 元素
xsl:choose元素
用于结合 <xsl:when> 和 <xsl:otherwise> 来表达多重条件测试
<xsl:choose>(可以包含多个xsl:when元素) <xsl:when test="expression"> ... 输出 ... </xsl:when> <xsl:otherwise> ... 输出 .... </xsl:otherwise> </xsl:choose>
xsl:apply-templates元素
可把一个模板应用于当前的元素或者当前元素的子节点,假如我们向 <xsl:apply-templates> 元素添加一个 select 属性,此元素就会仅仅处理与属性值匹配的子元素。我们可以使用 select 属性来规定子节点被处理的顺序。可以在xsl文件中写多个xsl:template,,然后通过xsl:apply-templates元素select属性调用
在客户端把 XML 文件转换为 XHTML 的源代码
<html> <body> <script type="text/javascript"> // Load XML var xml = new ActiveXObject("Microsoft.XMLDOM") xml.async = false xml.load("cdcatalog.xml") // Load XSL var xsl = new ActiveXObject("Microsoft.XMLDOM") xsl.async = false xsl.load("cdcatalog.xsl") // Transform document.write(xml.transformNode(xsl)) </script> </body> </html>
在服务器上把 XML 文件转换为 XHTML 的源代码
<% 'Load XML set xml = Server.CreateObject("Microsoft.XMLDOM") xml.async = false xml.load(Server.MapPath("cdcatalog.xml")) 'Load XSL set xsl = Server.CreateObject("Microsoft.XMLDOM") xsl.async = false xsl.load(Server.MapPath("cdcatalog.xsl"))
ASP文件
我们将使用 XSL 把 XML 文档转换到一个 HTML 表单中。XML 元素的值会被写到 HTML 表单中的 HTML 输入域。此表单是可编辑的。在被编辑完成后,数据会被提交回服务器,XML 文件会得到更新(这部分由 ASP 完成)
在上面 "tool.xsl" 文件中, HTML 表单的 action 属性的值是 "edittool.asp" 。
第一个XSL 文件会循环遍历 XML 文件中的元素,并为每个 XML "field" 元素创建一个输入域。field 元素的 id 属性的值被添加到每个 HTML 输入域的 id 和 name 属性。"value" 元素的值被添加到每个 HTML 输入域的 "value" 属性。结果是,可以得到一个包含 XML 文件中值的可编辑的 HTML 表单。
然后,第二个样式表"tool_updated.xsl"。这个 XSL 文件会被用来显示已更新的 XML 数据。这个样式表不会输出可编辑 HTML 表单,而是一个静态的 HTML 表格
"edittool.asp" 页面包含两个函数:loadFile() 载入并转换 XML 文件,updateFile() 函数更新 XML 文件:
<% function loadFile(xmlfile,xslfile) Dim xmlDoc,xslDoc '加载 XML 文件 set xmlDoc = Server.CreateObject("Microsoft.XMLDOM") xmlDoc.async = false xmlDoc.load(xmlfile) '加载 XSL 文件 set xslDoc = Server.CreateObject("Microsoft.XMLDOM") xslDoc.async = false xslDoc.load(xslfile) '转换文件 Response.Write(xmlDoc.transformNode(xslDoc)) end function function updateFile(xmlfile) Dim xmlDoc,rootEl,f Dim i '加载 XML 文件 set xmlDoc = Server.CreateObject("Microsoft.XMLDOM") xmlDoc.async = false xmlDoc.load(xmlfile) '设置 rootEl 变量为根元素 Set rootEl = xmlDoc.documentElement '循环遍历 form 集 for i = 1 To Request.Form.Count '除去表单中的按钮元素 if instr(1,Request.Form.Key(i),"btn_")=0 then 'selectSingleNode 方法可查询匹配某个查询的 XML 文件中的某个单一节点。 '此查询会请求 value 元素,此 value 元素是 field 元素的子元素, '而此 field 元素拥有可匹配表单集中当前 key 值的 id 属性。 '如果存在匹配,则设置 text 属性为表单集中当前域的值。 set f = rootEl.selectSingleNode("field[@id='" & _ Request.Form.Key(i) & "']/value") f.Text = Request.Form(i) end if next '保存已修改的 XML 文件 xmlDoc.save xmlfile '释放所有的对象引用 set xmlDoc=nothing set rootEl=nothing set f=nothing '通过一个样式表加载已修改的 XML 文件,这样客户端就可以看到所编辑的信息 loadFile xmlfile,server.MapPath("tool_updated.xsl") end function '如果表单已被提交,则更新XML文件并显示结果,如果没有被提交,则转换此 XML 文件以供编辑 if Request.Form("btn_sub")="" then loadFile server.MapPath("tool.xml"),server.MapPath("tool.xsl") else updateFile server.MapPath("tool.xml") end if %> 'Transform file Response.Write(xml.transformNode(xsl)) %>
当今,XML 是非常重要的技术,并且开发项目正在使用这些基于 XML 的技术:
- 用 XML Schema 定义 XML 的结构和数据类型
- 用 XSLT 来转换 XML 数据
- 用 SOAP 来交换应用程序之间的 XML 数据
- 用 WSDL 来描述网络服务
- 用 RDF 来描述网络资源
- 用 XPath 和 XQuery 来访问 XML 数据
- 用 SMIL 来定义图形
XSLT 元素
apply-imports
应用来自导入样式表中的模版规则。
apply-templates
向当前元素或当前元素的子元素应用模板。
attribute
向元素添加属性。
attribute-set
创建命名的属性集。
call-template
调用一个指定的模板。
choose
与<when>以及<otherwise>协同使用,来表达多重条件测试。
comment
在结果树中创建注释节点。
copy
创建当前节点的一个备份(无子节点及属性)。
copy-of
创建当前节点的一个备份(带有子节点及属性)。
decimal-format
定义当通过 format-number() 函数把数字转换为字符串时,所要使用的字符和符号。
element
在输出文档中创建一个元素节点。
fallback
假如处理器不支持某个XSLT元素,规定一段备用代码来运行。
for-each
遍历指定的节点集中的每个节点。
if
包含一个模板,仅当某个指定的条件成立时应用此模板。
import
用于把一个样式表中的内容倒入另一个样式表中。
include
把一个样式表中的内容包含到另一个样式表中。
key
声明一个命名的键。
message
向输出写一条消息(用于错误报告)。
namespace-alias
把样式表中的命名空间替换为输出中不同的命名空间。
number
测定当前节点的整数位置,并对数字进行格式化。
otherwise
规定 <choose> 元素的默认动作。
output
定义输出文档的格式。
param
声明一个局部或全局参数。
preserve-space
用于定义保留空白的元素。
processing-instruction
生成处理指令节点。
sort
对结果进行排序。
strip-space
定义应当删除空白字符的元素。
stylesheet
定义样式表的根元素。
template
当指定的节点被匹配时所应用的规则。
text
通过样式表生成文本节点。
transform
定义样式表的根元素。
value-of
提取选定节点的值。
variable
声明局部或者全局的变量。
when
规定 <choose> 元素的动作。
with-param
规定需被传入某个模板的参数的值。
XSLT 函数
XSLT 含有超过 100 个内建的函数。这些函数用于字符串值、数值、日期和时间比较、节点和 QName 操作、序列操作、逻辑值,等等等等。
XSLT 函数的命名空间的 URI 是:
http://www.w3.org/2005/02/xpath-functions
函数命名空间的默认前缀是 fn。
提示:函数在被调用时常带有 fn: 前缀,比如 fn:string()。不过,既然 fn: 是命名空间的默认前缀,那么在被调用时,函数的名称不必使用前缀。
您可以在我们的 XPath 教程中访问所有内建的 XSLT 2.0 函数参考。
此外,在此列出了内建的 XSLT 函数:
current()
返回当前节点作为唯一成员的节点集。
document()
用于访问外部 XML 文档中的节点。
element-available()
检测 XSLT 处理器是否支持指定的元素。
format-number()
把数字转换为字符串。
function-available()
检测 XSLT 处理器是否支持指定的函数。
generate-id()
返回唯一标识指定节点的字符串值。
key()
检索以前使用 <xsl:key> 语句标记的元素。
node-set
将树转换为节点集。产生的节点集总是包含单个节点并且是树的根节点。
system-property()
返回系统属性的值。
unparsed-entity-uri()
返回未解析实体的 URI。