XSL相当与网页中的CSS!
1 <xsl:template
name= Qname
match = Pattern
priority = number
mode = QName
</xsl:template>
name
要展开的限定名。 如果有前缀,前缀将使用出现名称的属性上的有效命名空间声明展开为统一资源标识符 (URI) 引用。 扩展名称由名称的本地部分以及可能的空 URI 引用组成,作为模板的名称。 没有前缀的名称不使用默认的命名空间。 如果 <xsl:template> 元素有 name 属性,可以(但是不需要)同时有 match 属性。
match
标识应用规则的源节点的模式。 match 属性是必选项,除非 <xsl:template> 元素有 name 属性。 <xsl:template> 元素的内容是在应用模板规则时实例化的模板。
模式是一种表达式,根据节点的一组条件返回一组节点。 符合条件的节点与模式匹配。 模式语法是表达式语法的一个子集。 特别是,符合特定限制的位置路径可以作为模式使用。 如果表达式同时也是模式,将总是计算为节点集类型的对象。 如果某个节点是将模式作为表达式(与某些可能的上下文有关)的计算结果的成员,则表示该节点符合模式;这里可能的上下文是其上下文节点属于匹配节点或其上级之一的上下文。
下表列出了模式的示例。
模式 | 匹配 |
Para | 任何 para 元素 |
* | 任何元素 |
chapter|appendix | 任何 chapter 元素和任何 appendix 元素 |
olist/item | 任何具有 olist 父级的 item 元素 |
appendix//para | 任何具有 appendix 祖先元素的 para 元素 |
/ | 根节点 |
text() | 任何文本节点 |
processing-instruction() | 任何处理指令 |
node() | 除了属性节点和根节点以外的任何节点 |
id("W11") | 具有唯一 ID W11 的元素 |
para[1] | 任何属于父级的第一个 para 子元素的 para 元素 |
*[position()=1 and self::para] | 任何属于父级的第一个子元素的 para 元素 |
para[last()=1] | 任何属于父级的唯一一个 para 子元素的 para 元素 |
items/item[position()>1] | 任何具有 items 父级但不是父级的第一个 item 子元素的 item 元素 |
item[position() mod 2 = 1] | 任何属于父级的奇数个 item 子元素的 item 元素 |
div[@class="appendix"]//p | 任何 div 祖先元素具有值为 appendix 的 class 属性的 p 元素 |
@class | 任何 class 属性(不是任何具有 class 属性的元素) |
@* | 任何属性 |
XSL解析XML需要用到
/ | 根节点 |
。
2 for-each
|
|
<xsl:for-each select = Expression </xsl:for-each> |
select
必选项。表达式 在当前上下文中计算,确定要循环访问的节点集。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="foreach.xsl" ?>
<customers>
<customer>
<name>John Smith</name>
<address>123 Oak St.</address>
<state>WA</state>
<phone>(206) 123-4567</phone>
</customer>
</customers>
</xml>
解析用的
<xsl:for-each select="customers/customer">
<xsl:sort select="state" order="descending"/>
<xsl:sort select="name"/>
3 <xsl:sort
select = string-expression
lang = { nmtoken }
data-type = { "text" | "number" | QName }
order = { "ascending" | "descending" }
case-order = { "upper-first" | "lower-first" }
/>
指定根据 <xsl:for-each> 或 <xsl:apply-templates> 选择的节点列表的排序条件。
select
节点的排序关键字。 将指定节点作为当前节点并将未排序进行处理的完整节点列表作为当前节点列表计算的表达式。 生成的对象转换为字符串,作为该节点的排序关键字。 select 属性的默认值为 "."。 这样,当前节点的字符串值将作为排序关键字使用。
order
字符串的排序顺序。 默认值为 "ascending"。
4 <xsl:value-of
select = Expression
disable-output-escaping = "yes" | "no"
</xsl:value-of>
select
必选项。 要根据当前上下文计算的表达式。 通过调用 string() 函数,将结果转换为字符串。 通过插入节点集中第一个节点的字符串值,将节点集转换为字符串。
disable-output-escaping
默认值为 "no"。 如果值为 "yes",通过实例化 <xsl:value-of> 元素生成的文本节点在输出时将不进行任何转义。
5 <xsl:text
disable-output-escaping = "yes" | "no">
</xsl:text>
通过样式表生成文本节点。 在输出中保留纯空白节点。
在样式表中,生成的文本可以是包含或不包含 <xsl:text> 的文本结果树。 但是,通过此元素可以对样式表创建的空白进行一定的控制。 例如,为了更容易阅读样式表,可能需要在模板上每行编写一个元素,并在某些行上缩进。 这样做可以使空白成为模板规则的一部分。有时,可能需要使用空白字符分隔两个数据值。 可以使用 <xsl:text> 元素实现这一点。 <xsl:text> 中的空白将输出到结果树中。
6 <xsl:if
test = boolean-expression
</xsl:if>
允许简单条件模板片断。
test
必选项。 源数据中要测试的条件。 如果此属性中的表达式在被强制转换为布尔值时计算为 True,<xsl:if> 的内容便会实例化并放入输出。如果节点集至少包含一个节点,将强制转换为布尔值。
内容是模板。 将计算该表达式,并将生成的对象转换为布尔值。 如果结果为 True,内容模板将实例化;否则,不会创建任何内容。
例子
在此示例中,一个名称组中的名称格式化为通过逗号分隔的列表。
<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="ifcomma.xsl" ?>
<namelist>
<name>Albert</name>
<name>Terrance</name>
<name>Will</name>
<name>Sylvia</name>
<name>Timothy</name>
<name>Gordon</name>
<name>James</name>
<name>Robert</name>
<name>Dan</name>
<name>Sasha</name>
</namelist>
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="namelist/name">
<xsl:apply-templates/>
<xsl:if test="position()!=last()">, </xsl:if>
</xsl:template>
</xsl:stylesheet>
另外一种方法
<xsl:if test="position()!=1">, </xsl:if>
隔行换颜色
<xsl:if test="position() mod 2 = 0">
<xsl:attribute name="bgcolor">yellow</xsl:attribute>
</xsl:if>
<xsl:apply-templates/>
7 <xsl:attribute
name = "attribute-name"
namespace = "uri-reference">
</xsl:attribute>
创建一个属性节点并将其附加到输出元素上。
name
必选项。 要创建的属性的名称。 如果此值为限定名称 (QName),属性节点将在当前绑定到前缀上的命名空间中创建,除非 namespace 属性重写此值。 name 属性的值被解释为属性值模板(如同在 <xsl:value-of> 元素中一样,对大括号中的表达式进行计算并转换为字符串)。这样,可以从源 XML 计算或获取属性名称。
XML 文件 (myelem.xml)
Xml | 复制代码 |
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="attrcopied.xsl" ?> <root> <myElement>My Data</myElement> <myElement>My Other Data</myElement> </root> |
XSLT 文件 (attrcopied.xsl)
Xml | 复制代码 |
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="myElement"> <xsl:copy> <xsl:attribute name="copied">true</xsl:attribute> <xsl:apply-templates /> </xsl:copy> </xsl:template>
</xsl:stylesheet> |
输出
以下是格式化输出:
My DataMy Other Data
以下是处理器输出,为了清楚起见,增加了分行符。
<?xml version="1.0"?>
<myElement copied="true">My Data</myElement>
<myElement copied="true">My Other Data</myElement>
不会影响到用户看到的内容