一、元素
apply-imports:应用来自导入样式表中的模版规则。因为导入样式表中的模版规则优先级比主样式表中的低,所以当需要使用导入样式表中的模版规则时需要使用此元素。
apply-templates:当前元素或子元素应用模版。具有以下属性:select:要处理的节点。若为“*”表示整个节点集,若不设置,表示当前节点的所有子节点。
mode:如果存在为相同元素定义的多个处理方法,可以用mode进行区分。
attribute:添加属性,会替换名称相同的已有属性。具有以下属性:
name:属性名称。
uri:属性所在命名空间URI。
attribute-set:创建可命名的属性集,可做为整体应用到输出文档。必须是 <xsl:stylesheet> 或 <xsl:transform> 的子节点。具有以下属性:
name:属性集名称。
use-attribute-sets:可在该属性集中使用的空格分隔的其他属性集列表。
call-template:调用一个指定的模版。
name:被调用的模版名称。
choose:与<xsl:when> 以及 <xsl:otherwise> 元素结合,进行多重条件选择。如果没有 <xsl:when> 是 true,则处理 <xsl:otherwise> 的内容。如果没有 <xsl:when> 是 true,且不存在 <xsl:otherwise> 元素,则不创建任何内容。如果只是简单的选择可以使用if元素代替。
comment:在结果树中创建注释节点。
copy:创建当前节点的一个副本,节点的namespace会被自动复制,但是当前节点的子节点和属性不会被复制。具有以下属性:
use-attribute-sets:如果被复制节点是元素,那么此属性为应用到输出节点的空格分隔的属性集列表。
copy-of:创建当前节点的一个副本,与copy不同的是除了namespace以外,当前节点的子节点与属性也会被复制。具有以下属性:
select:指定要拷贝的内容。
decimal-format:定义通过format-number() 函数把字符转换为字符串时,使用的格式。该元素为顶层元素。具有以下属性:
name:格式名称。format-number() 函数可以通过此名称引用此元素。
decimal-separator:小数点字符,默认为“.”。
grouping-separator:千的分隔字符,默认为“,”。
infinity:表示无穷大的字符,默认为“Infinity”。
minus-sign:表示负数的字符,默认为“-”。
NaN:当值不是数字时使用的字符,默认为“NaN”。
percent:百分比符号,默认为“%”。
per-mille:千分比符号,默认为“‰”。
zero-digit:数字0的字符,默认为“0”。
digit:规定字符,表示需要使用数字的地方,默认为“#”。
pattern-separator:规定字符,分隔模式中的正负次模式,默认为“;”。
element:在输出文档中创建一个元素节点。具有以下属性:
name:要创建的元素名称。
namespace:元素命名空间的URI。
use-attribute-sets:需要项元素添加的空格分隔的属性集列表。
fallback:处理器不支持XSLT元素时,所指定的替代代码。
for-each:遍历指定节点集中的每个节点。具有以下属性:
select:被处理的节点集。
if:包含一个模版,当条件成立时应用此模版。具有以下属性:
test:要测试的条件。
import:把一个样式表中的内容导入到另一个样式表,被导入的样式优先级低于当前的样式,此元素必须是<xsl:stylesheet> 或 <xsl:transform> 的第一个子节点。具有以下属性:
href:要导入的样式表的URI。
include:把一个样式表中的内容包含到另一个样式表中,被导入的样式与当前的样式优先级相同,此元素必须是<xsl:stylesheet> 或 <xsl:transform> 的子节点。具有以下属性:
href:要包含的的样式表的URI。
key:声明一个命名的键,通过key()函数在样式表中使用,键可以不是唯一的。此元素为顶层元素。具有以下属性:
name:键的名称。
match:定义键应用到哪个节点。
use:做为键的值使用的表达式,可以是属性、子元素或者匹配元素的内容。
message:向输出写一条消息。主要用于报告错误。具有以下属性:
terminate:可选值有:yes(在消息写入输出后,终止处理)、no(在消息写入输出后,继续进行处理),默认为no。
namespace-alias:把样式表中的命名空间替换为输出中不同的命名空间。此元素为顶层元素。具有以下属性:
stylesheet-prefix:要更改的命名空间。
result-prefix:期望的命名空间。
number:测定在源中当前节点的整数位置,同时还可以对数字进行格式化。具有以下属性:
count:要计数的节点,XPath表达式。
level:如何分配序号,可选值有single、multiple、any。默认为single。
from:XPath 表达式,指定从何处开始计数。
value:用户提供的数字,用于代替产生的序号。
format:定义数字的输出格式。可选值为:
1:生成的序列为:1 2 3 4 5 ... 10 11 12 ...
01:生成的序列为:01 02 03 ... 19 10 11 ...
a:生成的序列为:a b c ...
A:生成的序列为:A B C ...
i:生成的序列为:i ii iii iv v vi vii viii ix x...
I:生成的序列为:I II III IV V VI VII VIII IX X...
lang:用于编号的语言字母表。
letter-value:消除使用字母的编号序列之间的歧义。可选值有alphabetic(字母序列)、traditional(其他序列),默认为alphabetic。
grouping-separator:分隔组或数字的字符,默认为“,”。
grouping-size:分组大小,默认为3。
otherwise :指定了<xsl:choose> 元素的默认行为。在没有 <xsl:when> 的条件触发时,将发生该行为。
output:定义输出文档的格式,顶层元素。具有以下属性:
method:定义输出格式,可选值有xml、html、text、name,默认为xml。
version:输出格式的版本,仅在method为html或xml时有效。
encoding:输出的编码。
omit-xml-declaration:输出中是否省略xml声明,yes(省略)、no(包含),默认为no。
standalone:XSLT处理器是否应该输出独立文档声明。默认为no。
doctype-public:指定 DTD 中要使用的公共标识符。
doctype-system:指定 DTD 中要使用的系统标识符。
cdata-section-elements:空格分隔的元素列表,这些元素的文本内容做为CDATA部分输出。
indent:在输出结果树时是否要增加空白。
media-type:定义输出的 MIME 类型,默认是 "text/xml"。
param:声明局部或全局参数。具有以下属性:
name:参数的名称。
select:参数的默认值。
preserve-space:指定保留空白的元素。具有以下属性:
elements:空格分隔的元素列表,此外可以设置“*”表示所有元素,“prefix:*”,表示特定命名空间的所有元素。
processing-instruction:向输出写一条处理指令,即生成处理指令节点。具有以下属性:
name:处理指令的名称。
sort:对结果进行排序,只能位于<xsl:for-each> 或 <xsl:apply-templates> 内部。具有以下属性:
select:用于节点排序的关键字,即根据哪个节点或节点集排序。
lang:排序所用的语言。
data-type:被排序的数据类型,可选值为text、number、qname,默认为“text”。
order:排序顺序,可选值为ascending、ascending,默认为ascending。
case-order:是否首先按大(小)写字母进行排序,可选值为upper-first、lower-first。
strip-space:指定保留空白的元素。具有以下属性:
elements:空格分隔的元素列表,此外可以设置“*”表示所有元素,“prefix:*”,表示特定命名空间的所有元素。
stylesheet/transform:样式表根元素。具有以下属性:
version:样式表XSLT版本。
extension-element-prefixes:空格分隔的扩展元素的命名空间前缀列表。
exclude-result-prefixes:空格分隔的不在输出中出现的命名空间前缀列表。
id:样式表唯一id。
template:匹配指定节点时应用的规则,此元素为顶层元素。具有以下属性:
name:模版名称。
match:模版匹配模式。name与match至少要定义一个。
mode:模版模式。
priority:模版优先级。
text:通过样式表生成文本节点。可包含文本、实体引用,以及 #PCDATA。具有以下属性:
disable-output-escaping:通过text元素生成的文本节点在输出时是否不进行转义,如果为yes,不进行转义,如果为no,进行转义,默认为no。
value-of:提取选定节点的值。具有以下属性:
select:XPath 表达式,指定从哪个节点/属性提取值。
disable-output-escaping:通过text元素生成的文本节点在输出时是否不进行转义,如果为yes,不进行转义,如果为no,进行转义,默认为no。
variable:声明局部或全局的变量,一旦设置了变量值就无法再修改。具有以下属性:
name:变量的名称。
select:变量的值。如果设置了此属性variable元素就不能包含任何内容。
when:为 <xsl:choose> 元素规定相关动作。如果表达式计算为true,则执行指定的动作。具有以下属性:
test:要测试的表达式。
with-param:定义传递给模版的参数和值。具有以下属性:
name:参数名。此属性的值应与param元素中的name相匹配。
select:定义参数值的XPath表达式。
二、简单示例
以w3c例子中的数据为基础,并进行了适当的修改:cdcatalog.xml。
import.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="artist" mode="import">
Artist:
<span>
<xsl:attribute name="style">
<xsl:text>color:</xsl:text>
<xsl:value-of select="key('colors','artist')/green" />
</xsl:attribute>
<xsl:value-of select="." />
</span>
<br />
</xsl:template>
</xsl:stylesheet>
include.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="title" mode="include">
Title:
<span>
<xsl:attribute name="style">
<xsl:text>color:</xsl:text>
<xsl:value-of select="key('colors','title')/blue" />
</xsl:attribute>
<xsl:value-of select="." />
</span>
<br />
</xsl:template>
</xsl:stylesheet>
main.xsl
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="import.xsl" />
<xsl:template match="/">
<html>
<body>
<xsl:comment>xslt file</xsl:comment>
<h2>My CD Collection</h2>
<!--<xsl:apply-templates /> -->
<xsl:call-template name="table" />
</body>
</html>
</xsl:template>
<xsl:strip-space elements="price year " />
<xsl:preserve-space elements="title artist" />
<xsl:variable name="header">
<tr bgcolor="#9acd32">
<th align="left">Order</th>
<th align="left">Title</th>
<th align="left">Artist</th>
<th align="left">Price</th>
<th align="left">Year</th>
</tr>
</xsl:variable>
<xsl:decimal-format name="CHN" decimal-separator="." grouping-separator="," />
<xsl:key name="colors" match="/catalog/color" use="@id" />
<xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent="yes" />
<!-- table template -->
<xsl:template name="table">
<table border="1">
<xsl:copy-of select="$header" />
<xsl:for-each select="catalog/cd">
<xsl:sort select="title" order="descending" />
<tr>
<td><xsl:number value="position()" format="01" /></td>
<td><xsl:apply-templates select="title" /></td>
<td><xsl:value-of select="artist" /></td>
<td>
<xsl:call-template name="show_price">
<xsl:with-param name="color">
<xsl:if test="price = ''">
<xsl:message terminate="yes">
<xsl:text>price of title </xsl:text>
<xsl:value-of select="title" />
<xsl:text> not found.</xsl:text>
</xsl:message>
</xsl:if>
<xsl:if test="price > 10">
<xsl:value-of select="key('colors','price')/red" />
</xsl:if>
<xsl:if test="price <= 10">
<xsl:value-of select="key('colors','price')/yellow" />
</xsl:if>
</xsl:with-param>
</xsl:call-template>
</td>
<td>
<xsl:choose>
<xsl:when test="year >= 1990">
<b><xsl:value-of select="year" /></b>
</xsl:when>
<xsl:when test="year < 1990 and year >= 1980 ">
<i><xsl:value-of select="year" /></i>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="year" />
</xsl:otherwise>
</xsl:choose>
</td>
</tr>
</xsl:for-each>
</table>
<xsl:element name="div">
<xsl:copy>
<xsl:call-template name="list" />
</xsl:copy>
</xsl:element>
</xsl:template>
<xsl:template match="title">
<span>
<xsl:attribute name="style">
<xsl:text>color:</xsl:text>
<xsl:value-of select="key('colors','title')/red" />
</xsl:attribute>
<xsl:value-of select="." />
</span>
</xsl:template>
<xsl:template name="show_price">
<xsl:param name="color" />
<span>
<xsl:attribute name="style">
<xsl:text>color:</xsl:text>
<xsl:value-of select="$color" />
</xsl:attribute>
<xsl:value-of select="format-number(price,'#,###.00','CHN')" />
</span>
</xsl:template>
<!-- list template -->
<xsl:template name="list">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="color" />
<xsl:template match="cd">
<p>
<xsl:apply-templates select="title" mode="include" />
<xsl:apply-templates select="artist" mode="import" />
</p>
</xsl:template>
<xsl:template match="title" mode="current">
Title:
<span>
<xsl:attribute name="style">
<xsl:text>color:</xsl:text>
<xsl:value-of select="key('colors','title')/red" />
</xsl:attribute>
<xsl:value-of select="." />
</span>
<br />
</xsl:template>
<xsl:template match="artist" mode="import">
<xsl:apply-imports />
</xsl:template>
<xsl:template match="artist" mode="current">
Artist:
<span>
<xsl:attribute name="style">
<xsl:text>color:</xsl:text>
<xsl:value-of select="key('colors','artist')/blue" />
</xsl:attribute>
<xsl:value-of select="." />
</span>
<br />
</xsl:template>
<xsl:include href="include.xsl" />
</xsl:stylesheet>