XSL 语言


XSL 指扩展样式表语言(EXtensible Stylesheet Language),它是一个 XML 文档的样式表语言。

它起始于 XSL,结束于 XSLT、XPath 以及 XSL-FO。


起始于 XSL

XSL 指扩展样式表语言(EXtensible Stylesheet Language)。

万维网联盟(W3C)开始发展 XSL 的原因是:存在着对于基于 XML 的样式表语言的需求。


CSS = HTML 样式表

HTML 使用预先定义的标签,每个标签的意义很容易被理解

HTML 中的 <table> 标签定义表格 - 并且浏览器清楚如何显示它

向 HTML 元素添加样式是很容易的。通过 CSS,很容易告知浏览器用特定的字体或颜色显示一个元素。


XSL = XML 样式表

XML 不使用预先定义的标签(我们可以使用任何喜欢的标签名),并且每个标签的意义并不都那么容易被理解

<table> 标签意味着一个 HTML 表格,一件家具,或是别的什么东西 - 浏览器不清楚如何显示它

XSL 可描述如何来显示 XML 文档!


XSL - 不仅仅是样式表语言

XSL 包括三部分:

  • XSLT - 一种用于转换 XML 文档的语言。
  • XPath - 一种用于在 XML 文档中导航的语言。
  • XSL-FO - 一种用于格式化 XML 文档的语言。

本教程的主要内容是 XSLT

本教程的其余部分主要介绍的是 XSLT - 用来转换 XML 文档的语言。

在本教程中,你将学习如何使用 XSLT 将 XML 文档转换为其他文档,比如 XHTML。


相关教程

XML教程

XHTML教程

XSLT 简介


在计算机科学中,XSLT 是 扩展样式表转换语言 的外语缩写。

XSLT 中的T代表英语中的“转换”(Transformation)。

XSLT 是一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言。

XPath 是一种用于在 XML 文档中进行导航的语言。


您需要具备的基础知识

在您继续学习之前,需要对以下知识有基本的了解:

  • HTML / XHTML
  • XML / XML 命名空间
  • XPath

如果您想要首先学习这些项目,请在我们的首页访问这些教程。


什么是 XSLT?

  • XSLT 指 XSL 转换(XSL Transformations)
  • XSLT 是 XSL 中最重要的部分
  • XSLT 可将一种 XML 文档转换为另外一种 XML 文档
  • XSLT 使用 XPath 在 XML 文档中进行导航
  • XSLT 是一个 W3C 标准

XSLT = XSL 转换

XSLT 是 XSL 中最重要的部分。

XSLT 用于将一种 XML 文档转换为另外一种 XML 文档,或者可被浏览器识别的其他类型的文档,比如 HTML 和 XHTML。通常,XSLT 是通过把每个 XML 元素转换为 (X)HTML 元素来完成这项工作的。

通过 XSLT,您可以向输出文件添加元素和属性,或从输出文件移除元素和属性。您也可重新排列并分类元素,执行测试并决定隐藏或显示哪个元素,等等。

描述转化过程的一种通常的说法是,XSLT 把 XML 源树转换为 XML 结果树


XSLT 使用 XPath

XSLT 使用 XPath 在 XML 文档中查找信息。XPath 被用来通过元素和属性在 XML 文档中进行导航。

如果您想要首先学习 XPath,请访问我们的 XPath 教程


它如何工作?

在转换过程中,XSLT 使用 XPath 来定义源文档中可匹配一个或多个预定义模板的部分。一旦匹配被找到,XSLT 就会把源文档的匹配部分转换为结果文档。


XSLT 是一个 W3C 标准

XSLT 在 1999 年 11 月 16 日被确立为 W3C 标准。

如需更多有关 W3C 的 XSLT 活动的信息,请访问我们的 W3C 教程

从下一节开始,你将学习到更多与 XSLT 相关的知识!

XSLT 浏览器

本节简单的介绍哪些浏览器版本是支持使用 XSLT 的。

所有主流的浏览器都支持 XML 和 XSLT。


Mozilla Firefox

从版本 3 开始,Firefox 就已支持 XML、XSLT 和 XPath。


Internet Explorer

从版本 6 开始,Internet Explorer 就已支持 XML、XSLT 和 XPath。

Internet Explorer 5 不兼容官方的 W3C XSL 标准。


Google Chrome

从版本 1 开始,Chrome 就已支持 XML、XSLT 和 XPath。


Opera

从版本 9 开始,Opera 就已支持 XML、XSLT 和 XPath。Opera 8 仅支持 XML + CSS。


Apple Safari

从版本 3 开始,Safari 就已支持 XML 和 XSLT。

XSLT - 转换

XSLT 是一种用来转换 XML 文档结构的语言,本节通过举例来教你将 XML 文档转换成 XHTML。

实例研究:如何使用 XSLT 将 XML 转换为 XHTML。

我们会在下一章对本实例的细节进行解释。


正确的样式表声明

把文档声明为 XSL 样式表的根元素是 <xsl:stylesheet> 或 <xsl:transform>。

注意:<xsl:stylesheet> 和 <xsl:transform> 是完全同义的,均可被使用!

根据 W3C 的 XSLT 标准,声明 XSL 样式表的正确方法是:

<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">

如需访问 XSLT 的元素、属性以及特性,我们必须在文档顶端声明 XSLT 命名空间。

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 指向了官方的 W3C XSLT 命名空间。如果您使用此命名空间,就必须包含属性 version="1.0"。


从一个原始的 XML 文档开始

我们现在要把下面这个 XML 文档("cdcatalog.xml")转换为 XHTML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
.
.
</catalog>

在 Firefox 和 Internet Explorer 中查看 XML 文件:打开 XML 文件(通常通过点击某个链接) - XML 文档会以颜色化的代码方式来显示根元素及子元素。点击元素左侧的加号(+)或减号(-)可展开或收缩元素的结构。如需查看原始的 XML 源文件(不带有加号和减号),请在浏览器菜单中选择"查看页面源代码"或"查看源代码"。

在 Netscape 6 中查看 XML 文件:打开 XML 文件,然后在 XML 文件中右击,并选择"查看页面源代码"。XML 文档会以颜色化的代码方式来显示根元素及子元素。

在 Opera 7 中查看 XML 文件:打开 XML 文件,然后在 XML 文件中右击,选择"框架"/"查看源代码"。XML 文档将显示为纯文本。

查看 "cdcatalog.xml"


创建 XSL 样式表

然后创建一个带有转换模板的 XSL 样式表("cdcatalog.xsl"):

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

把 XSL 样式表链接到 XML 文档

向 XML 文档("cdcatalog.xml")添加 XSL 样式表引用:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
.
.
</catalog>

如果您使用的浏览器兼容 XSLT,它会很顺利地把您的 XML 转换为 XHTML。

查看结果

在下一节内容中,我们将会对本节出现的实例做出更加细节的介绍!

XSLT - 在客户端


如果您的浏览器支持 XSLT,那么在浏览器中它可被用来将文档转换为 XHTML。

但是并非所有的浏览器都是支持 XSLT 的,因此,你可以在客户端把 XML 转换为 XHTML!


JavaScript 解决方案

在前面的章节,我们已向您讲解如何使用 XSLT 将某个 XML 文档转换为 XHTML。我们是通过以下途径完成这个工作的:向 XML 文件添加 XSL 样式表,并通过浏览器完成转换。

即使这种方法的效果很好,在 XML 文件中包含样式表引用也不总是令人满意的(例如,在无法识别 XSLT 的浏览器这种方法就无法奏效)。

更通用的方法是使用 JavaScript 来完成转换。

通过使用 JavaScript,我们可以:

  • 进行浏览器确认测试
  • 根据浏览器和用户需求来使用不同的样式表

这就是 XSLT 的魅力所在!XSLT 的设计目的之一就是使数据从一种格式转换到另一种格式成为可能,同时支持不同类型的浏览器以及不同的用户需求。

客户端的 XSLT 转换一定会成为未来浏览器所执行的主要任务之一,同时我们也会看到其在特定的浏览器市场的增长(盲文、听觉浏览器、网络打印机,手持设备,等等)。


XML 文件和 XSL 文件

请看这个在前面的章节已展示过的 XML 文档:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
.
.
</catalog>

查看 XML 文件

以及附随的 XSL 样式表:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left">Title</th>
<th align="left">Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title" /></td>
<td><xsl:value-of select="artist" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

查看 XSL 文件

请注意,这个 XML 文件没有包含对 XSL 文件的引用。

重要事项:上面这句话意味着,XML 文件可使用多个不同的 XSL 样式表来进行转换。


在浏览器中把 XML 转换为 XHTML

这是用于在客户端把 XML 文件转换为 XHTML 的源代码:

实例

<html>
<head>
<script>
function loadXMLDoc(dname)
{
if (window.ActiveXObject)
{
xhttp=new ActiveXObject("Msxml2.XMLHTTP.3.0");
}
else
{
xhttp=new XMLHttpRequest();
}
xhttp.open("GET",dname,false);
xhttp.send("");
return xhttp.responseXML;
}

function displayResult()
{
xml=loadXMLDoc("cdcatalog.xml");
xsl=loadXMLDoc("cdcatalog.xsl");
// code for IE
if (window.ActiveXObject)
{
ex=xml.transformNode(xsl);
document.getElementById("example").innerHTML=ex;
}
// code for Mozilla, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
{
xsltProcessor=new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
resultDocument = xsltProcessor.transformToFragment(xml,document);
document.getElementById("example").appendChild(resultDocument);
}
}
</script>
</head>
<body onload="displayResult()">
<div id="example" />
</body>
</html>

尝试一下 »

提示:假如您不了解如何编写 JavaScript,请学习我们的 JavaScript 教程

实例解释:

loadXMLDoc() 函数

loadXMLDoc() 函数是用来加载 XML 和 XSL 文件。

它检查用户拥有的和加载文件的浏览器类型。

displayResult() 函数

该函数用来显示使用 XSL 文件定义样式的 XML 文件。

  • 加载 XML 和 XSL 文件
  • 测试用户拥有的浏览器类型
  • 如果用户浏览器支持 ActiveX 对象:
    • 使用 transformNode() 方法把 XSL 样式表应用到 XML 文档
    • 设置当前文档(id="example")的 body 包含已经应用样式的 XML 文档
  • 如果用户的浏览器不支持 ActiveX 对象:
    • 创建一个新的 XSLTProcessor 对象并导入 XSL 文件
    • 使用 transformToFragment() 方法把 XSL 样式表应用到 XML 文档
    • 设置当前文档(id="example")的 body 包含已经应用样式的 XML 文档

XSLT - 在服务器端

你可以在一个服务器端把 XML 转换成 XHTML,详情请参考本节内容。

由于并非所有的浏览器都支持 XSLT,另一种解决方案是在服务器上完成 XML 至 XHTML 的转化。


跨浏览器解决方案

在前面的章节,我们讲解过如何在浏览器中使用 XSLT 来完成 XML 到 XHTML 的转化。我们创建了一段使用 XML 解析器来进行转换的 JavaScript。JavaScript 解决方案无法工作于没有 XML 解析器的浏览器。

为了让 XML 数据适用于任何类型的浏览器,我们必须在服务器上对 XML 文档进行转换,然后将其作为 XHMTL 发送回浏览器。

这是 XSLT 的另一个优点。XSLT 的设计目标之一是使数据在服务器上从一种格式转换到另一种格式成为可能,并向所有类型的浏览器返回可读的数据。


XML 文件和 XSLT 文件

请看这个在前面的章节已展示过的 XML 文档:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
.
.
</catalog>

查看 XML 文件

以及附随的 XSL 样式表:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left">Title</th>
<th align="left">Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title" /></td>
<td><xsl:value-of select="artist" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

查看 XSL 文件

请注意,这个 XML 文件没有包含对 XSL 文件的引用。

重要事项:上面这句话意味着,XML 文件可使用多个不同的 XSL 样式表来进行转换。


在服务器把 XML 转换为 XHTML

这是用于在服务器上把 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"))

'Transform file
Response.Write(xml.transformNode(xsl))
%>

提示:假如您不了解如何编写 ASP,您可以学习我们的 ASP 教程

第一段代码创建了微软的 XML 解析器(XMLDOM)的一个实例,并把 XML 文件载入了内存。第二段代码创建了解析器的另一个实例,并把这个 XSL 文件载入了内存。最后一行代码使用 XSL 文档转换了 XML 文档,并把结果作为 XHTML 发送到您的浏览器。太好了!

它是如何工作的

在下面的一节内容中,我们将为你讲解如何编辑 XML!

XSLT - 编辑 XML

本节为你讲解如何编辑 XML 文件中的数据。

存储在 XML 文件中的数据可通过因特网浏览器进行编辑。


打开、编辑并保存 XML

现在,我们会为您展示如何打开、编辑及保存存储于服务器上的 XML 文件。

我们将使用 XSL 把 XML 文档转换到一个 HTML 表单中。XML 元素的值会被写到 HTML 表单中的 HTML 输入域。这个 HTML 表单是可编辑的。在被编辑完成后,数据会被提交回服务器,XML 文件会得到更新(这部分由 ASP 完成)。


XML 文件和 XSL 文件

首先,请看将被使用的 XML 文档("tool.xml"):

<?xml version="1.0" encoding="ISO-8859-1"?>
<tool>
<field id="prodName">
<value>HAMMER HG2606</value>
</field>
<field id="prodNo">
<value>32456240</value>
</field>
<field id="price">
<value>$30.00</value>
</field>
</tool>

接着,请看下面的样式表("tool.xsl"):

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<form method="post" action="edittool.html">
<h2>Tool Information (edit):</h2>
<table border="0">
<xsl:for-each select="tool/field">
<tr>
<td><xsl:value-of select="@id"/></td>
<td>
<input type="text">
<xsl:attribute name="id">
<xsl:value-of select="@id" />
</xsl:attribute>
<xsl:attribute name="name">
<xsl:value-of select="@id" />
</xsl:attribute>
<xsl:attribute name="value">
<xsl:value-of select="value" />
</xsl:attribute>
</input>
</td>
</tr>
</xsl:for-each>
</table>
<br />
<input type="submit" id="btn_sub" name="btn_sub" value="Submit" />
<input type="reset" id="btn_res" name="btn_res" value="Reset" />
</form>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

上面这个 XSL 文件会循环遍历 XML 文件中的元素,并为每个 XML "field" 元素创建一个输入域。XML "field" 元素的 "id" 属性的值被添加到每个 HTML 输入域的 "id" 和 "name" 属性。每个 XML "value" 元素的值被添加到每个 HTML 输入域的 "value" 属性。结果是,可以得到一个包含 XML 文件中值的可编辑的 HTML 表单。

然后,我们还有第二个样式表:"tool_updated.xsl"。这个 XSL 文件会被用来显示已更新的 XML 数据。这个样式表不会输出可编辑 HTML 表单,而是一个静态的 HTML 表格:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h2>Updated Tool Information:</h2>
<table border="1">
<xsl:for-each select="tool/field">
<tr>
<td><xsl:value-of select="@id" /></td>
<td><xsl:value-of select="value" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

ASP 文件

在上面 "tool.xsl" 文件中,HTML 表单的 action 属性的值是 "edittool.asp" 。

"edittool.asp" 页面包含两个函数:loadFile() 函数载入并转换 XML 文件,updateFile() 函数更新 XML 文件:

<%
function loadFile(xmlfile,xslfile)
Dim xmlDoc,xslDoc
'Load XML file
set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
xmlDoc.load(xmlfile)
'Load XSL file
set xslDoc = Server.CreateObject("Microsoft.XMLDOM")
xslDoc.async = false
xslDoc.load(xslfile)
'Transform file
Response.Write(xmlDoc.transformNode(xslDoc))
end function

function updateFile(xmlfile)
Dim xmlDoc,rootEl,f
Dim i
'Load XML file
set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
xmlDoc.load(xmlfile)

'Set the rootEl variable equal to the root element
Set rootEl = xmlDoc.documentElement

'Loop through the form collection
for i = 1 To Request.Form.Count
'Eliminate button elements in the form
if instr(1,Request.Form.Key(i),"btn_")=0 then
'The selectSingleNode method queries the XML file for a single node
'that matches a query. This query requests the value element that is
'the child of a field element that has an id attribute which matches
'the current key value in the Form Collection. When there is a match -
'set the text property equal to the value of the current field in the
'Form Collection.
set f = rootEl.selectSingleNode("field[@id='" & _
Request.Form.Key(i) & "']/value")
f.Text = Request.Form(i)
end if
next

'Save the modified XML file
xmlDoc.save xmlfile

'Release all object references
set xmlDoc=nothing
set rootEl=nothing
set f=nothing

'Load the modified XML file with a style sheet that
'allows the client to see the edited information
loadFile xmlfile,server.MapPath("tool_updated.xsl")
end function

'If the form has been submitted update the
'XML file and display result - if not,
'transform the XML file for editing
if Request.Form("btn_sub")="" then
loadFile server.MapPath("tool.xml"),server.MapPath("tool.xsl")
else
updateFile server.MapPath("tool.xml")
end if
%>

提示:假如您不了解如何编写 ASP,请学习我们的 ASP 教程

注意:我们正在转换并更新位于服务器上的 XML 文件。这是一个跨平台的解决方案。客户端仅能获得从服务器返回的 HTML - 而 HTML 可运行于任何浏览器。

以上就是有关如何编辑 XML 问价中的数据的全部内容了,在下一节中,你将认识 XML 编辑器。

XML 编辑器


如果希望极认真地学习和使用 XML,那么您一定会从使用一款专业的 XML 编辑器中受益。

一个好的 XML 编辑器会让你的工作变得方便许多,跟着本节内容一起来看看什么样的 XML 是合适的! 


XML 是基于文本的

XML 是基于文本的标记语言。

关于 XML 的一件很重要的事情是,XML 文件可被类似记事本这样的简单的文本编辑器来创建和编辑。

不过,在您开始使用 XML 进行工作时,您很快会发现,使用一款专业的 XML 编辑器来编辑 XML 文档会更好。


为什么不使用记事本?

许多 Web 开发人员使用记事本来编辑 HTML 和 XML 文档,这是因为最常用的操作系统都带有记事本,而且它很容易使用。从个人来讲,我经常使用记事本来快速地编辑某些简单的 HTMLCSS 以及 XML 文件。

但是,如果您使用记事本对 XML 进行编辑,可能很快会发现不少问题。

记事本不能确定您编辑的文档类型,所以也就无法辅助您的工作。


为什么使用 XML 编辑器?

当今,XML 是非常重要的技术,并且开发项目正在使用这些基于 XML 的技术:

  • 用 XML Schema 定义 XML 的结构和数据类型
  • 用 XSLT 来转换 XML 数据
  • 用 SOAP 来交换应用程序之间的 XML 数据
  • 用 WSDL 来描述网络服务
  • 用 RDF 来描述网络资源
  • 用 XPath 和 XQuery 来访问 XML 数据
  • 用 SMIL 来定义图形

为了能够编写出无错的 XML 文档,您需要一款智能的 XML 编辑器!


XML 编辑器

专业的 XML 编辑器会帮助您编写无错的 XML 文档,根据某种 DTD 或者 schema 来验证 XML,以及强制您创建合法的 XML 结构。

XML 编辑器应该具有如下能力:

  • 为开始标签自动添加结束标签
  • 强制您编写合法的 XML
  • 根据 DTD 来验证 XML
  • 根据 Schema 来验证 XML
  • 对您的 XML 语法进行代码的颜色化显示

相关教程

XML Schema教程

您已经学习了 XSLT,现在该怎么办?

本节是对 XSLT 教程的总结,到本节为止,有关 XSLT 教程的基本知识已经讲解完成,如果需要更多的参考,你可以访问本站的 XSLT 元素参考手册!

XSLT 总结

本教程已经向您讲解了如何使用 XSLT 把 XML 文档转换为其他格式,比如 XHTML。

您已经学会如何向输出文件添加元素和属性,并从输出文件移除元素和属性。

您也学习了如何对元素进行重新排列和排序,执行测试以及决定显示或隐藏哪些元素。

如需学习更多有关 XSLT 的知识,请查阅我们的 XSLT 参考手册


您已经学习了 XSLT,下一步应当学习什么呢?

XSL 包括三种语言:XSLT、XPath 以及 XSL-FO,因此下一步应当学习 XPath 和 XSL-FO。

XPath

XPath 用于经由元素和属性在 XML 文档中进行导航。

XPath 是 W3C 的 XSL 标准的主要元素。对 XPath 的理解是深入使用 XML 的基础。

XSL-FO

XSL-FO 可描述输出到屏幕、纸媒介或者其他媒介的 XML 数据的格式。

XSL-FO 文档是带有关于输出布局以及输出内容的信息的 XML 文件。

XSLT 元素参考手册

本节列举了 XSLT 中会使用到的元素!

源自于 W3C 推荐标准(XSLT Version 1.0)的 XSLT 元素。


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 把一个样式表中的内容包含到另一个样式表中。注意: 被包含的样式表(included style sheet)拥有与包含的样式表(including style sheet)相同的优先级。
key 声明一个命名的键,该键通过 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 函数

本节将为你讲解 XSLT 中使用的一些函数。

XQuery 1.0、XPath 2.0 以及 XSLT 2.0 共享相同的函数库。


XSLT 函数

XSLT 含有超过 100 个内建的函数。这些函数用于字符串值、数值、日期和时间比较、节点和 QName 操作、序列操作、布尔值,等等。

Note函数命名空间的默认前缀是 fn。

Note函数命名空间的 URI 是: http://www.w3.org/2005/xpath-functions

提示:函数在被调用时常带有 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> 元素规定的索引号返回节点集。
system-property() 返回系统属性的值。
unparsed-entity-uri() 返回未解析实体的 URI。
在下一节内容中,我们将开始详细的对上表中函数进行介绍。

XSLT current() 函数

XSLT current() 函数的作用是返回一个仅包含当前节点的节点集。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

current() 函数返回仅包含当前节点的节点集。通常,当前节点与上下文节点是相同的。

<xsl:value-of select="current()"/>

等于

<xsl:value-of select="."/>

不过,有一点不同。让我们看一下下面的 XPath 表达式:"catalog/cd"。表达式选择了当前节点的 <catalog> 子节点,然后选择了 <catalog> 节点的 <cd> 子节点。这意味着,在计算的每一步上,"." 都有不同的意义。

下面这行:

<xsl:apply-templates select="//cd[@title=current()/@ref]"/>

将处理 title 属性的值等于当前节点的 ref 属性的值的所有 cd 元素。

与这个不同:

<xsl:apply-templates select="//cd[@title=./@ref]"/>

这个会处理 title 属性和 ref 属性具有相同值的所有 cd 元素。


语法

node-set current()

实例 1

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<xsl:for-each select="catalog/cd/artist">
Current node: <xsl:value-of select="current()"/>
<br />
</xsl:for-each>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

XSLT 函数参考对象 完整的 XSLT 函数参考对象

XSLT document() 函数

XSLT document() 函数可以访问可以正确解析的外部 XML 文档。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

document() 函数用于访问外部 XML 文档中的节点。外部 XML 文档必须是合法且可解析的。

使用该函数的一种方式是在一个外部文档中查找数据。举例来说,我们希望找到与华氏度值相对应的摄氏度值,我们访问了包含预计算值的文档:

<xsl:value-of select="document('celsius.xml')/celsius/result[@value=$value]"/>


语法

node-set document(object,node-set?)

参数

参数 描述
object 必需。定义外部 XML 文档的 URI。
node-set 可选。用于解析相对 URI。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

相关教程

XML教程

XSLT element-available() 函数

XSLT element-available() 函数返回一个布尔值,本节内容描述了该值的作用。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

element-available() 函数返回一个布尔值,该值指示 XSLT 处理器是否支持指定的元素。

该函数只能用来测试位于模板主体的元素。这些元素是:

  • xsl:apply-imports
  • xsl:apply-templates
  • xsl:attributes
  • xsl:call-template
  • xsl:choose
  • xsl:comment
  • xsl:copy
  • xsl:copy-of
  • xsl:element
  • xsl:fallback
  • xsl:for-each
  • xsl:if
  • xsl:message
  • xsl:number
  • xsl:processing instruction
  • xsl:text
  • xsl:value-of
  • xsl:variable

语法

boolean element-available(string)

参数

参数 描述
string 必需。规定要测试的元素。

实例 1

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<xsl:choose>
<xsl:when test="element-available('xsl:comment')">
<p>xsl:comment is supported.</p>
</xsl:when>
<xsl:otherwise>
<p>xsl:comment is not supported.</p>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="element-available('xsl:delete')">
<p>xsl:delete is supported.</p>
</xsl:when>
<xsl:otherwise>
<p>xsl:delete is not supported.</p>
</xsl:otherwise>
</xsl:choose>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

XSLT 函数参考对象 完整的 XSLT 函数参考对象

XSLT format-number() 函数

使用 format-number() 函数可以将数字转换成字符串。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

format-number() 函数用于把数字转换为字符串。


语法

string format-number(number,format,[decimalformat])

参数

参数 描述
number 必需。规定要格式化的数字。
format 必需。规定格式化模式。这是用在格式化模式中的字符:
  • 0 (数字)
  • # (数字,零显示为空)
  • . (小数点的位置。例如:###.##)
  • , (千的组分隔符。例如:###,###.##)
  • % (把数字显示为百分比。例如:##%)
  • ; (模式分隔符。第一个模式用于正数,第二个模式用于负数)
decimalformat 可选。

实例 1

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<xsl:value-of select='format-number(500100, "#")' />
<br />
<xsl:value-of select='format-number(500100, "0")' />
<br />
<xsl:value-of select='format-number(500100, "#.00")' />
<br />
<xsl:value-of select='format-number(500100, "#.0")' />
<br />
<xsl:value-of select='format-number(500100, "###,###.00")' />
<br />
<xsl:value-of select='format-number(0.23456, "#%")' />
</body>
</html>
</xsl:template>

</xsl:stylesheet>

XSLT 函数参考对象 完整的 XSLT 函数参考对象

XSLT function-available() 函数

XSLT function-available() 函数返回一个布尔类型的值,该值的作用在本节内容中讲解。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

function-available() 函数返回一个布尔值,该值指示 XSLT 处理器是否支持指定的函数。

您可以测试 XSLT 函数和被继承的 XPath 函数。


语法

boolean function-available(string)

参数

参数 描述
string 必需。规定要测试的函数。

实例 1

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<xsl:choose>
<xsl:when test="function-available('sum')">
<p>sum() is supported.</p>
</xsl:when>
<xsl:otherwise>
<p>sum() is not supported.</p>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="function-available('current')">
<p>current() is supported.</p>
</xsl:when>
<xsl:otherwise>
<p>current() is not supported.</p>
</xsl:otherwise>
</xsl:choose>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

XSLT 函数参考对象 完整的 XSLT 函数参考对象

XSLT generate-id() 函数

本节讲解了 XSLT 中 generate-id() 函数的使用,包括它的语法与参数。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

generate-id() 函数返回唯一标识指定节点的字符串值。

如果指定的节点集是空的,则返回空字符串。如果省略了 node-set 参数,则默认设置为当前节点。


语法

string generate-id(node-set?)

参数

参数 描述
node-set 可选。规定要生成唯一 id 的节点集。

实例 1

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h3>Artists:</h3>
<ul>
<xsl:for-each select="catalog/cd">
<li>
<a href="#{generate-id(artist)}">
<xsl:value-of select="artist" /></a>
</li>
</xsl:for-each>
</ul>
<hr />
<xsl:for-each select="catalog/cd">
Artist: <a name="{generate-id(artist)}">
<xsl:value-of select="artist" /></a>
<br />
Title: <xsl:value-of select="title" />
<br />
Price: <xsl:value-of select="price" />
<hr />
</xsl:for-each>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

XSLT 函数参考对象 完整的 XSLT 函数参考对象

XSLT key() 函数


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

key() 函数通过使用由 <xsl:key> 元素规定的索引号,从文档中返回节点集。


语法

node-set key(string, object)

参数

参数 描述
string 必需。规定 xsl:key 元素的名称。
object 必需。要搜索的字符串。

实例 1

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="cdlist" match="cd" use="title" />

<xsl:template match="/">
<html>
<body>
<xsl:for-each select="key('cdlist', 'Empire Burlesque')">
<p>
Title: <xsl:value-of select="title" />
<br />
Artist: <xsl:value-of select="artist" />
<br />
Price: <xsl:value-of select="price" />
</p>
</xsl:for-each>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

XSLT 函数参考对象 完整的 XSLT 函数参考对象

相关文章

XSLT <xsl:key> 元素

XSLT 函数参考手册

本节是对 XSLT 中的 node-set() 函数的简单介绍。

定义和用法

使您可以将树转换为节点集。产生的节点集总是包含单个节点并且是树的根节点。

对于早期版本的 Microsoft XML 核心服务 (MSXML),可以使用 <xsl:for-each select="$var/el"> 等表达式,其中的 var 是绑定到结果树上的 XSLT 变量。但是,此方法不适用于 MSXML 版本 3.0 以及更高版本。要在这些更高版本的 MSXML 中获得相同的结果,请使用 node-set 函数,如以下代码示例中所示。

<xsl:for-each select="msxsl:node-set($var)/el)">

语法

msxsl:node-set(string)

XSLT system-property() 函数

XSLT system-property() 函数返回指定名称的系统属性。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

system-property() 函数返回通过名称标识的系统属性的值。

在 XSLT 命名空间中的系统属性:

  • xsl:version - 处理器实现的 XSLT 版本
  • xsl:vendor - XSLT 处理器的开发商
  • xsl:vendor-url - 标识 XSLT 处理器的开发商的 URL

语法

object system-property(string)

参数

参数 描述
string 必需。规定返回其值的系统属性。

实例 1

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<p>
版本:
<xsl:value-of select="system-property('xsl:version')" />
<br />
Vendor:
<xsl:value-of select="system-property('xsl:vendor')" />
<br />
Vendor URL:
<xsl:value-of select="system-property('xsl:vendor-url')" />
</p>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

XSLT 函数参考对象 完整的 XSLT 函数参考对象

XSLT unparsed-entity-uri() 函数

XSLT unparsed-entity-uri() 函数用于返回未解析的实体的URI。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

unparsed-entity-uri() 函数返回未解析实体的 URI。实体名称必须匹配被传递的参数。如果定义了实体,则返回未分析实体的 URI 字符串。否则,返回空字符串。

如果 DTD 含有下面的声明:

<!ENTITY pic SYSTEM "//www.51coolma.cn/picture.jpg" NDATA JPEG>

这个表达式:

unparsed-entity-uri('pic')

将返回文件 "picture.jpg" 的 URI。


语法

string unparsed-entity-uri(string)

参数

参数 描述
string 必需。规定未解析的实体的名称。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

相关教程

DTD教程

XSL 语言


XSL 指扩展样式表语言(EXtensible Stylesheet Language),它是一个 XML 文档的样式表语言。

它起始于 XSL,结束于 XSLT、XPath 以及 XSL-FO。


起始于 XSL

XSL 指扩展样式表语言(EXtensible Stylesheet Language)。

万维网联盟(W3C)开始发展 XSL 的原因是:存在着对于基于 XML 的样式表语言的需求。


CSS = HTML 样式表

HTML 使用预先定义的标签,每个标签的意义很容易被理解

HTML 中的 <table> 标签定义表格 - 并且浏览器清楚如何显示它

向 HTML 元素添加样式是很容易的。通过 CSS,很容易告知浏览器用特定的字体或颜色显示一个元素。


XSL = XML 样式表

XML 不使用预先定义的标签(我们可以使用任何喜欢的标签名),并且每个标签的意义并不都那么容易被理解

<table> 标签意味着一个 HTML 表格,一件家具,或是别的什么东西 - 浏览器不清楚如何显示它

XSL 可描述如何来显示 XML 文档!


XSL - 不仅仅是样式表语言

XSL 包括三部分:

  • XSLT - 一种用于转换 XML 文档的语言。
  • XPath - 一种用于在 XML 文档中导航的语言。
  • XSL-FO - 一种用于格式化 XML 文档的语言。

本教程的主要内容是 XSLT

本教程的其余部分主要介绍的是 XSLT - 用来转换 XML 文档的语言。

在本教程中,你将学习如何使用 XSLT 将 XML 文档转换为其他文档,比如 XHTML。


相关教程

XML教程

XHTML教程

XSLT 简介


在计算机科学中,XSLT 是 扩展样式表转换语言 的外语缩写。

XSLT 中的T代表英语中的“转换”(Transformation)。

XSLT 是一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言。

XPath 是一种用于在 XML 文档中进行导航的语言。


您需要具备的基础知识

在您继续学习之前,需要对以下知识有基本的了解:

  • HTML / XHTML
  • XML / XML 命名空间
  • XPath

如果您想要首先学习这些项目,请在我们的首页访问这些教程。


什么是 XSLT?

  • XSLT 指 XSL 转换(XSL Transformations)
  • XSLT 是 XSL 中最重要的部分
  • XSLT 可将一种 XML 文档转换为另外一种 XML 文档
  • XSLT 使用 XPath 在 XML 文档中进行导航
  • XSLT 是一个 W3C 标准

XSLT = XSL 转换

XSLT 是 XSL 中最重要的部分。

XSLT 用于将一种 XML 文档转换为另外一种 XML 文档,或者可被浏览器识别的其他类型的文档,比如 HTML 和 XHTML。通常,XSLT 是通过把每个 XML 元素转换为 (X)HTML 元素来完成这项工作的。

通过 XSLT,您可以向输出文件添加元素和属性,或从输出文件移除元素和属性。您也可重新排列并分类元素,执行测试并决定隐藏或显示哪个元素,等等。

描述转化过程的一种通常的说法是,XSLT 把 XML 源树转换为 XML 结果树


XSLT 使用 XPath

XSLT 使用 XPath 在 XML 文档中查找信息。XPath 被用来通过元素和属性在 XML 文档中进行导航。

如果您想要首先学习 XPath,请访问我们的 XPath 教程


它如何工作?

在转换过程中,XSLT 使用 XPath 来定义源文档中可匹配一个或多个预定义模板的部分。一旦匹配被找到,XSLT 就会把源文档的匹配部分转换为结果文档。


XSLT 是一个 W3C 标准

XSLT 在 1999 年 11 月 16 日被确立为 W3C 标准。

如需更多有关 W3C 的 XSLT 活动的信息,请访问我们的 W3C 教程

从下一节开始,你将学习到更多与 XSLT 相关的知识!

XSLT 浏览器

本节简单的介绍哪些浏览器版本是支持使用 XSLT 的。

所有主流的浏览器都支持 XML 和 XSLT。


Mozilla Firefox

从版本 3 开始,Firefox 就已支持 XML、XSLT 和 XPath。


Internet Explorer

从版本 6 开始,Internet Explorer 就已支持 XML、XSLT 和 XPath。

Internet Explorer 5 不兼容官方的 W3C XSL 标准。


Google Chrome

从版本 1 开始,Chrome 就已支持 XML、XSLT 和 XPath。


Opera

从版本 9 开始,Opera 就已支持 XML、XSLT 和 XPath。Opera 8 仅支持 XML + CSS。


Apple Safari

从版本 3 开始,Safari 就已支持 XML 和 XSLT。

XSLT - 转换

XSLT 是一种用来转换 XML 文档结构的语言,本节通过举例来教你将 XML 文档转换成 XHTML。

实例研究:如何使用 XSLT 将 XML 转换为 XHTML。

我们会在下一章对本实例的细节进行解释。


正确的样式表声明

把文档声明为 XSL 样式表的根元素是 <xsl:stylesheet> 或 <xsl:transform>。

注意:<xsl:stylesheet> 和 <xsl:transform> 是完全同义的,均可被使用!

根据 W3C 的 XSLT 标准,声明 XSL 样式表的正确方法是:

<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">

如需访问 XSLT 的元素、属性以及特性,我们必须在文档顶端声明 XSLT 命名空间。

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 指向了官方的 W3C XSLT 命名空间。如果您使用此命名空间,就必须包含属性 version="1.0"。


从一个原始的 XML 文档开始

我们现在要把下面这个 XML 文档("cdcatalog.xml")转换为 XHTML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
.
.
</catalog>

在 Firefox 和 Internet Explorer 中查看 XML 文件:打开 XML 文件(通常通过点击某个链接) - XML 文档会以颜色化的代码方式来显示根元素及子元素。点击元素左侧的加号(+)或减号(-)可展开或收缩元素的结构。如需查看原始的 XML 源文件(不带有加号和减号),请在浏览器菜单中选择"查看页面源代码"或"查看源代码"。

在 Netscape 6 中查看 XML 文件:打开 XML 文件,然后在 XML 文件中右击,并选择"查看页面源代码"。XML 文档会以颜色化的代码方式来显示根元素及子元素。

在 Opera 7 中查看 XML 文件:打开 XML 文件,然后在 XML 文件中右击,选择"框架"/"查看源代码"。XML 文档将显示为纯文本。

查看 "cdcatalog.xml"


创建 XSL 样式表

然后创建一个带有转换模板的 XSL 样式表("cdcatalog.xsl"):

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

把 XSL 样式表链接到 XML 文档

向 XML 文档("cdcatalog.xml")添加 XSL 样式表引用:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
.
.
</catalog>

如果您使用的浏览器兼容 XSLT,它会很顺利地把您的 XML 转换为 XHTML。

查看结果

在下一节内容中,我们将会对本节出现的实例做出更加细节的介绍!

XSLT - 在客户端


如果您的浏览器支持 XSLT,那么在浏览器中它可被用来将文档转换为 XHTML。

但是并非所有的浏览器都是支持 XSLT 的,因此,你可以在客户端把 XML 转换为 XHTML!


JavaScript 解决方案

在前面的章节,我们已向您讲解如何使用 XSLT 将某个 XML 文档转换为 XHTML。我们是通过以下途径完成这个工作的:向 XML 文件添加 XSL 样式表,并通过浏览器完成转换。

即使这种方法的效果很好,在 XML 文件中包含样式表引用也不总是令人满意的(例如,在无法识别 XSLT 的浏览器这种方法就无法奏效)。

更通用的方法是使用 JavaScript 来完成转换。

通过使用 JavaScript,我们可以:

  • 进行浏览器确认测试
  • 根据浏览器和用户需求来使用不同的样式表

这就是 XSLT 的魅力所在!XSLT 的设计目的之一就是使数据从一种格式转换到另一种格式成为可能,同时支持不同类型的浏览器以及不同的用户需求。

客户端的 XSLT 转换一定会成为未来浏览器所执行的主要任务之一,同时我们也会看到其在特定的浏览器市场的增长(盲文、听觉浏览器、网络打印机,手持设备,等等)。


XML 文件和 XSL 文件

请看这个在前面的章节已展示过的 XML 文档:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
.
.
</catalog>

查看 XML 文件

以及附随的 XSL 样式表:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left">Title</th>
<th align="left">Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title" /></td>
<td><xsl:value-of select="artist" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

查看 XSL 文件

请注意,这个 XML 文件没有包含对 XSL 文件的引用。

重要事项:上面这句话意味着,XML 文件可使用多个不同的 XSL 样式表来进行转换。


在浏览器中把 XML 转换为 XHTML

这是用于在客户端把 XML 文件转换为 XHTML 的源代码:

实例

<html>
<head>
<script>
function loadXMLDoc(dname)
{
if (window.ActiveXObject)
{
xhttp=new ActiveXObject("Msxml2.XMLHTTP.3.0");
}
else
{
xhttp=new XMLHttpRequest();
}
xhttp.open("GET",dname,false);
xhttp.send("");
return xhttp.responseXML;
}

function displayResult()
{
xml=loadXMLDoc("cdcatalog.xml");
xsl=loadXMLDoc("cdcatalog.xsl");
// code for IE
if (window.ActiveXObject)
{
ex=xml.transformNode(xsl);
document.getElementById("example").innerHTML=ex;
}
// code for Mozilla, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
{
xsltProcessor=new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
resultDocument = xsltProcessor.transformToFragment(xml,document);
document.getElementById("example").appendChild(resultDocument);
}
}
</script>
</head>
<body onload="displayResult()">
<div id="example" />
</body>
</html>

尝试一下 »

提示:假如您不了解如何编写 JavaScript,请学习我们的 JavaScript 教程

实例解释:

loadXMLDoc() 函数

loadXMLDoc() 函数是用来加载 XML 和 XSL 文件。

它检查用户拥有的和加载文件的浏览器类型。

displayResult() 函数

该函数用来显示使用 XSL 文件定义样式的 XML 文件。

  • 加载 XML 和 XSL 文件
  • 测试用户拥有的浏览器类型
  • 如果用户浏览器支持 ActiveX 对象:
    • 使用 transformNode() 方法把 XSL 样式表应用到 XML 文档
    • 设置当前文档(id="example")的 body 包含已经应用样式的 XML 文档
  • 如果用户的浏览器不支持 ActiveX 对象:
    • 创建一个新的 XSLTProcessor 对象并导入 XSL 文件
    • 使用 transformToFragment() 方法把 XSL 样式表应用到 XML 文档
    • 设置当前文档(id="example")的 body 包含已经应用样式的 XML 文档

XSLT - 在服务器端

你可以在一个服务器端把 XML 转换成 XHTML,详情请参考本节内容。

由于并非所有的浏览器都支持 XSLT,另一种解决方案是在服务器上完成 XML 至 XHTML 的转化。


跨浏览器解决方案

在前面的章节,我们讲解过如何在浏览器中使用 XSLT 来完成 XML 到 XHTML 的转化。我们创建了一段使用 XML 解析器来进行转换的 JavaScript。JavaScript 解决方案无法工作于没有 XML 解析器的浏览器。

为了让 XML 数据适用于任何类型的浏览器,我们必须在服务器上对 XML 文档进行转换,然后将其作为 XHMTL 发送回浏览器。

这是 XSLT 的另一个优点。XSLT 的设计目标之一是使数据在服务器上从一种格式转换到另一种格式成为可能,并向所有类型的浏览器返回可读的数据。


XML 文件和 XSLT 文件

请看这个在前面的章节已展示过的 XML 文档:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
.
.
</catalog>

查看 XML 文件

以及附随的 XSL 样式表:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left">Title</th>
<th align="left">Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title" /></td>
<td><xsl:value-of select="artist" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

查看 XSL 文件

请注意,这个 XML 文件没有包含对 XSL 文件的引用。

重要事项:上面这句话意味着,XML 文件可使用多个不同的 XSL 样式表来进行转换。


在服务器把 XML 转换为 XHTML

这是用于在服务器上把 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"))

'Transform file
Response.Write(xml.transformNode(xsl))
%>

提示:假如您不了解如何编写 ASP,您可以学习我们的 ASP 教程

第一段代码创建了微软的 XML 解析器(XMLDOM)的一个实例,并把 XML 文件载入了内存。第二段代码创建了解析器的另一个实例,并把这个 XSL 文件载入了内存。最后一行代码使用 XSL 文档转换了 XML 文档,并把结果作为 XHTML 发送到您的浏览器。太好了!

它是如何工作的

在下面的一节内容中,我们将为你讲解如何编辑 XML!

XSLT - 编辑 XML

本节为你讲解如何编辑 XML 文件中的数据。

存储在 XML 文件中的数据可通过因特网浏览器进行编辑。


打开、编辑并保存 XML

现在,我们会为您展示如何打开、编辑及保存存储于服务器上的 XML 文件。

我们将使用 XSL 把 XML 文档转换到一个 HTML 表单中。XML 元素的值会被写到 HTML 表单中的 HTML 输入域。这个 HTML 表单是可编辑的。在被编辑完成后,数据会被提交回服务器,XML 文件会得到更新(这部分由 ASP 完成)。


XML 文件和 XSL 文件

首先,请看将被使用的 XML 文档("tool.xml"):

<?xml version="1.0" encoding="ISO-8859-1"?>
<tool>
<field id="prodName">
<value>HAMMER HG2606</value>
</field>
<field id="prodNo">
<value>32456240</value>
</field>
<field id="price">
<value>$30.00</value>
</field>
</tool>

接着,请看下面的样式表("tool.xsl"):

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<form method="post" action="edittool.html">
<h2>Tool Information (edit):</h2>
<table border="0">
<xsl:for-each select="tool/field">
<tr>
<td><xsl:value-of select="@id"/></td>
<td>
<input type="text">
<xsl:attribute name="id">
<xsl:value-of select="@id" />
</xsl:attribute>
<xsl:attribute name="name">
<xsl:value-of select="@id" />
</xsl:attribute>
<xsl:attribute name="value">
<xsl:value-of select="value" />
</xsl:attribute>
</input>
</td>
</tr>
</xsl:for-each>
</table>
<br />
<input type="submit" id="btn_sub" name="btn_sub" value="Submit" />
<input type="reset" id="btn_res" name="btn_res" value="Reset" />
</form>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

上面这个 XSL 文件会循环遍历 XML 文件中的元素,并为每个 XML "field" 元素创建一个输入域。XML "field" 元素的 "id" 属性的值被添加到每个 HTML 输入域的 "id" 和 "name" 属性。每个 XML "value" 元素的值被添加到每个 HTML 输入域的 "value" 属性。结果是,可以得到一个包含 XML 文件中值的可编辑的 HTML 表单。

然后,我们还有第二个样式表:"tool_updated.xsl"。这个 XSL 文件会被用来显示已更新的 XML 数据。这个样式表不会输出可编辑 HTML 表单,而是一个静态的 HTML 表格:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h2>Updated Tool Information:</h2>
<table border="1">
<xsl:for-each select="tool/field">
<tr>
<td><xsl:value-of select="@id" /></td>
<td><xsl:value-of select="value" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

ASP 文件

在上面 "tool.xsl" 文件中,HTML 表单的 action 属性的值是 "edittool.asp" 。

"edittool.asp" 页面包含两个函数:loadFile() 函数载入并转换 XML 文件,updateFile() 函数更新 XML 文件:

<%
function loadFile(xmlfile,xslfile)
Dim xmlDoc,xslDoc
'Load XML file
set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
xmlDoc.load(xmlfile)
'Load XSL file
set xslDoc = Server.CreateObject("Microsoft.XMLDOM")
xslDoc.async = false
xslDoc.load(xslfile)
'Transform file
Response.Write(xmlDoc.transformNode(xslDoc))
end function

function updateFile(xmlfile)
Dim xmlDoc,rootEl,f
Dim i
'Load XML file
set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
xmlDoc.load(xmlfile)

'Set the rootEl variable equal to the root element
Set rootEl = xmlDoc.documentElement

'Loop through the form collection
for i = 1 To Request.Form.Count
'Eliminate button elements in the form
if instr(1,Request.Form.Key(i),"btn_")=0 then
'The selectSingleNode method queries the XML file for a single node
'that matches a query. This query requests the value element that is
'the child of a field element that has an id attribute which matches
'the current key value in the Form Collection. When there is a match -
'set the text property equal to the value of the current field in the
'Form Collection.
set f = rootEl.selectSingleNode("field[@id='" & _
Request.Form.Key(i) & "']/value")
f.Text = Request.Form(i)
end if
next

'Save the modified XML file
xmlDoc.save xmlfile

'Release all object references
set xmlDoc=nothing
set rootEl=nothing
set f=nothing

'Load the modified XML file with a style sheet that
'allows the client to see the edited information
loadFile xmlfile,server.MapPath("tool_updated.xsl")
end function

'If the form has been submitted update the
'XML file and display result - if not,
'transform the XML file for editing
if Request.Form("btn_sub")="" then
loadFile server.MapPath("tool.xml"),server.MapPath("tool.xsl")
else
updateFile server.MapPath("tool.xml")
end if
%>

提示:假如您不了解如何编写 ASP,请学习我们的 ASP 教程

注意:我们正在转换并更新位于服务器上的 XML 文件。这是一个跨平台的解决方案。客户端仅能获得从服务器返回的 HTML - 而 HTML 可运行于任何浏览器。

以上就是有关如何编辑 XML 问价中的数据的全部内容了,在下一节中,你将认识 XML 编辑器。

XML 编辑器


如果希望极认真地学习和使用 XML,那么您一定会从使用一款专业的 XML 编辑器中受益。

一个好的 XML 编辑器会让你的工作变得方便许多,跟着本节内容一起来看看什么样的 XML 是合适的! 


XML 是基于文本的

XML 是基于文本的标记语言。

关于 XML 的一件很重要的事情是,XML 文件可被类似记事本这样的简单的文本编辑器来创建和编辑。

不过,在您开始使用 XML 进行工作时,您很快会发现,使用一款专业的 XML 编辑器来编辑 XML 文档会更好。


为什么不使用记事本?

许多 Web 开发人员使用记事本来编辑 HTML 和 XML 文档,这是因为最常用的操作系统都带有记事本,而且它很容易使用。从个人来讲,我经常使用记事本来快速地编辑某些简单的 HTMLCSS 以及 XML 文件。

但是,如果您使用记事本对 XML 进行编辑,可能很快会发现不少问题。

记事本不能确定您编辑的文档类型,所以也就无法辅助您的工作。


为什么使用 XML 编辑器?

当今,XML 是非常重要的技术,并且开发项目正在使用这些基于 XML 的技术:

  • 用 XML Schema 定义 XML 的结构和数据类型
  • 用 XSLT 来转换 XML 数据
  • 用 SOAP 来交换应用程序之间的 XML 数据
  • 用 WSDL 来描述网络服务
  • 用 RDF 来描述网络资源
  • 用 XPath 和 XQuery 来访问 XML 数据
  • 用 SMIL 来定义图形

为了能够编写出无错的 XML 文档,您需要一款智能的 XML 编辑器!


XML 编辑器

专业的 XML 编辑器会帮助您编写无错的 XML 文档,根据某种 DTD 或者 schema 来验证 XML,以及强制您创建合法的 XML 结构。

XML 编辑器应该具有如下能力:

  • 为开始标签自动添加结束标签
  • 强制您编写合法的 XML
  • 根据 DTD 来验证 XML
  • 根据 Schema 来验证 XML
  • 对您的 XML 语法进行代码的颜色化显示

相关教程

XML Schema教程

您已经学习了 XSLT,现在该怎么办?

本节是对 XSLT 教程的总结,到本节为止,有关 XSLT 教程的基本知识已经讲解完成,如果需要更多的参考,你可以访问本站的 XSLT 元素参考手册!

XSLT 总结

本教程已经向您讲解了如何使用 XSLT 把 XML 文档转换为其他格式,比如 XHTML。

您已经学会如何向输出文件添加元素和属性,并从输出文件移除元素和属性。

您也学习了如何对元素进行重新排列和排序,执行测试以及决定显示或隐藏哪些元素。

如需学习更多有关 XSLT 的知识,请查阅我们的 XSLT 参考手册


您已经学习了 XSLT,下一步应当学习什么呢?

XSL 包括三种语言:XSLT、XPath 以及 XSL-FO,因此下一步应当学习 XPath 和 XSL-FO。

XPath

XPath 用于经由元素和属性在 XML 文档中进行导航。

XPath 是 W3C 的 XSL 标准的主要元素。对 XPath 的理解是深入使用 XML 的基础。

XSL-FO

XSL-FO 可描述输出到屏幕、纸媒介或者其他媒介的 XML 数据的格式。

XSL-FO 文档是带有关于输出布局以及输出内容的信息的 XML 文件。

XSLT 元素参考手册

本节列举了 XSLT 中会使用到的元素!

源自于 W3C 推荐标准(XSLT Version 1.0)的 XSLT 元素。


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 把一个样式表中的内容包含到另一个样式表中。注意: 被包含的样式表(included style sheet)拥有与包含的样式表(including style sheet)相同的优先级。
key 声明一个命名的键,该键通过 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 函数

本节将为你讲解 XSLT 中使用的一些函数。

XQuery 1.0、XPath 2.0 以及 XSLT 2.0 共享相同的函数库。


XSLT 函数

XSLT 含有超过 100 个内建的函数。这些函数用于字符串值、数值、日期和时间比较、节点和 QName 操作、序列操作、布尔值,等等。

Note函数命名空间的默认前缀是 fn。

Note函数命名空间的 URI 是: http://www.w3.org/2005/xpath-functions

提示:函数在被调用时常带有 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> 元素规定的索引号返回节点集。
system-property() 返回系统属性的值。
unparsed-entity-uri() 返回未解析实体的 URI。
在下一节内容中,我们将开始详细的对上表中函数进行介绍。

XSLT current() 函数

XSLT current() 函数的作用是返回一个仅包含当前节点的节点集。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

current() 函数返回仅包含当前节点的节点集。通常,当前节点与上下文节点是相同的。

<xsl:value-of select="current()"/>

等于

<xsl:value-of select="."/>

不过,有一点不同。让我们看一下下面的 XPath 表达式:"catalog/cd"。表达式选择了当前节点的 <catalog> 子节点,然后选择了 <catalog> 节点的 <cd> 子节点。这意味着,在计算的每一步上,"." 都有不同的意义。

下面这行:

<xsl:apply-templates select="//cd[@title=current()/@ref]"/>

将处理 title 属性的值等于当前节点的 ref 属性的值的所有 cd 元素。

与这个不同:

<xsl:apply-templates select="//cd[@title=./@ref]"/>

这个会处理 title 属性和 ref 属性具有相同值的所有 cd 元素。


语法

node-set current()

实例 1

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<xsl:for-each select="catalog/cd/artist">
Current node: <xsl:value-of select="current()"/>
<br />
</xsl:for-each>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

XSLT 函数参考对象 完整的 XSLT 函数参考对象

XSLT document() 函数

XSLT document() 函数可以访问可以正确解析的外部 XML 文档。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

document() 函数用于访问外部 XML 文档中的节点。外部 XML 文档必须是合法且可解析的。

使用该函数的一种方式是在一个外部文档中查找数据。举例来说,我们希望找到与华氏度值相对应的摄氏度值,我们访问了包含预计算值的文档:

<xsl:value-of select="document('celsius.xml')/celsius/result[@value=$value]"/>


语法

node-set document(object,node-set?)

参数

参数 描述
object 必需。定义外部 XML 文档的 URI。
node-set 可选。用于解析相对 URI。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

相关教程

XML教程

XSLT element-available() 函数

XSLT element-available() 函数返回一个布尔值,本节内容描述了该值的作用。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

element-available() 函数返回一个布尔值,该值指示 XSLT 处理器是否支持指定的元素。

该函数只能用来测试位于模板主体的元素。这些元素是:

  • xsl:apply-imports
  • xsl:apply-templates
  • xsl:attributes
  • xsl:call-template
  • xsl:choose
  • xsl:comment
  • xsl:copy
  • xsl:copy-of
  • xsl:element
  • xsl:fallback
  • xsl:for-each
  • xsl:if
  • xsl:message
  • xsl:number
  • xsl:processing instruction
  • xsl:text
  • xsl:value-of
  • xsl:variable

语法

boolean element-available(string)

参数

参数 描述
string 必需。规定要测试的元素。

实例 1

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<xsl:choose>
<xsl:when test="element-available('xsl:comment')">
<p>xsl:comment is supported.</p>
</xsl:when>
<xsl:otherwise>
<p>xsl:comment is not supported.</p>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="element-available('xsl:delete')">
<p>xsl:delete is supported.</p>
</xsl:when>
<xsl:otherwise>
<p>xsl:delete is not supported.</p>
</xsl:otherwise>
</xsl:choose>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

XSLT 函数参考对象 完整的 XSLT 函数参考对象

XSLT format-number() 函数

使用 format-number() 函数可以将数字转换成字符串。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

format-number() 函数用于把数字转换为字符串。


语法

string format-number(number,format,[decimalformat])

参数

参数 描述
number 必需。规定要格式化的数字。
format 必需。规定格式化模式。这是用在格式化模式中的字符:
  • 0 (数字)
  • # (数字,零显示为空)
  • . (小数点的位置。例如:###.##)
  • , (千的组分隔符。例如:###,###.##)
  • % (把数字显示为百分比。例如:##%)
  • ; (模式分隔符。第一个模式用于正数,第二个模式用于负数)
decimalformat 可选。

实例 1

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<xsl:value-of select='format-number(500100, "#")' />
<br />
<xsl:value-of select='format-number(500100, "0")' />
<br />
<xsl:value-of select='format-number(500100, "#.00")' />
<br />
<xsl:value-of select='format-number(500100, "#.0")' />
<br />
<xsl:value-of select='format-number(500100, "###,###.00")' />
<br />
<xsl:value-of select='format-number(0.23456, "#%")' />
</body>
</html>
</xsl:template>

</xsl:stylesheet>

XSLT 函数参考对象 完整的 XSLT 函数参考对象

XSLT function-available() 函数

XSLT function-available() 函数返回一个布尔类型的值,该值的作用在本节内容中讲解。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

function-available() 函数返回一个布尔值,该值指示 XSLT 处理器是否支持指定的函数。

您可以测试 XSLT 函数和被继承的 XPath 函数。


语法

boolean function-available(string)

参数

参数 描述
string 必需。规定要测试的函数。

实例 1

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<xsl:choose>
<xsl:when test="function-available('sum')">
<p>sum() is supported.</p>
</xsl:when>
<xsl:otherwise>
<p>sum() is not supported.</p>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="function-available('current')">
<p>current() is supported.</p>
</xsl:when>
<xsl:otherwise>
<p>current() is not supported.</p>
</xsl:otherwise>
</xsl:choose>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

XSLT 函数参考对象 完整的 XSLT 函数参考对象

XSLT generate-id() 函数

本节讲解了 XSLT 中 generate-id() 函数的使用,包括它的语法与参数。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

generate-id() 函数返回唯一标识指定节点的字符串值。

如果指定的节点集是空的,则返回空字符串。如果省略了 node-set 参数,则默认设置为当前节点。


语法

string generate-id(node-set?)

参数

参数 描述
node-set 可选。规定要生成唯一 id 的节点集。

实例 1

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h3>Artists:</h3>
<ul>
<xsl:for-each select="catalog/cd">
<li>
<a href="#{generate-id(artist)}">
<xsl:value-of select="artist" /></a>
</li>
</xsl:for-each>
</ul>
<hr />
<xsl:for-each select="catalog/cd">
Artist: <a name="{generate-id(artist)}">
<xsl:value-of select="artist" /></a>
<br />
Title: <xsl:value-of select="title" />
<br />
Price: <xsl:value-of select="price" />
<hr />
</xsl:for-each>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

XSLT 函数参考对象 完整的 XSLT 函数参考对象

XSLT key() 函数


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

key() 函数通过使用由 <xsl:key> 元素规定的索引号,从文档中返回节点集。


语法

node-set key(string, object)

参数

参数 描述
string 必需。规定 xsl:key 元素的名称。
object 必需。要搜索的字符串。

实例 1

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="cdlist" match="cd" use="title" />

<xsl:template match="/">
<html>
<body>
<xsl:for-each select="key('cdlist', 'Empire Burlesque')">
<p>
Title: <xsl:value-of select="title" />
<br />
Artist: <xsl:value-of select="artist" />
<br />
Price: <xsl:value-of select="price" />
</p>
</xsl:for-each>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

XSLT 函数参考对象 完整的 XSLT 函数参考对象

相关文章

XSLT <xsl:key> 元素

XSLT 函数参考手册

本节是对 XSLT 中的 node-set() 函数的简单介绍。

定义和用法

使您可以将树转换为节点集。产生的节点集总是包含单个节点并且是树的根节点。

对于早期版本的 Microsoft XML 核心服务 (MSXML),可以使用 <xsl:for-each select="$var/el"> 等表达式,其中的 var 是绑定到结果树上的 XSLT 变量。但是,此方法不适用于 MSXML 版本 3.0 以及更高版本。要在这些更高版本的 MSXML 中获得相同的结果,请使用 node-set 函数,如以下代码示例中所示。

<xsl:for-each select="msxsl:node-set($var)/el)">

语法

msxsl:node-set(string)

XSLT system-property() 函数

XSLT system-property() 函数返回指定名称的系统属性。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

system-property() 函数返回通过名称标识的系统属性的值。

在 XSLT 命名空间中的系统属性:

  • xsl:version - 处理器实现的 XSLT 版本
  • xsl:vendor - XSLT 处理器的开发商
  • xsl:vendor-url - 标识 XSLT 处理器的开发商的 URL

语法

object system-property(string)

参数

参数 描述
string 必需。规定返回其值的系统属性。

实例 1

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<p>
版本:
<xsl:value-of select="system-property('xsl:version')" />
<br />
Vendor:
<xsl:value-of select="system-property('xsl:vendor')" />
<br />
Vendor URL:
<xsl:value-of select="system-property('xsl:vendor-url')" />
</p>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

XSLT 函数参考对象 完整的 XSLT 函数参考对象

XSLT unparsed-entity-uri() 函数

XSLT unparsed-entity-uri() 函数用于返回未解析的实体的URI。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

定义和用法

unparsed-entity-uri() 函数返回未解析实体的 URI。实体名称必须匹配被传递的参数。如果定义了实体,则返回未分析实体的 URI 字符串。否则,返回空字符串。

如果 DTD 含有下面的声明:

<!ENTITY pic SYSTEM "//www.51coolma.cn/picture.jpg" NDATA JPEG>

这个表达式:

unparsed-entity-uri('pic')

将返回文件 "picture.jpg" 的 URI。


语法

string unparsed-entity-uri(string)

参数

参数 描述
string 必需。规定未解析的实体的名称。


XSLT 函数参考对象 完整的 XSLT 函数参考对象

相关教程

DTD教程