Extensible Stylescheet Language(XSL,可扩展样式单语言)
XSL本身也是一份XML文档。
作用:将一份XML文档转换成一份结构化文档(通常是HTML,当然也可以是XML)。
XSL的组成:
1:XSLT:XSL Transformation(XSLT),用于描述如何转换XML文档。
2:XPath:XSL使用XPath来识别、选择和匹配XML文档中的各种组件。
3:XSL-FO:Formatted Object在文档转换完成之后,可使用XSL-FO来解释结果树、格式化转换得到的文档。主要用于将XML转换成PDF。
XSLT入门
http://www.w3.org/1999/XSL/Transform是XSLT的命名空间URL
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
XSLT支持两个根元素,其效果和用法是完全一样的。
<xsl:stylesheet
id = id
extension-element-prefixes = tokens
exclude-result-prefixes = tokens
version = number>
<!-- Content: (xsl:import*, top-level-elements) -->
</xsl:stylesheet>
<xsl:transform
id = id
extension-element-prefixes = tokens
exclude-result-prefixes = tokens
version = number>
<!-- Content: (xsl:import*, top-level-elements) -->
</xsl:transform>
根元素可包含的子元素:
-
xsl:import
-
xsl:include
-
xsl:strip-space
-
xsl:preserve-space
-
xsl:output
-
xsl:key
-
xsl:decimal-format
-
xsl:namespace-alias
-
xsl:attribute-set
-
xsl:variable
-
xsl:param
-
xsl:template
XSLT处理器会将XML文档当成一颗结构化的树进行处理,XSLT的根节点问XML文档本身。
包含另一份XSLT
<!-- Category: top-level-element -->
<xsl:include
href = uri-reference />
注意事项:
1:<include../>元素之前只能出现<import.../>元素;
2:包含的样式单必须完整;
3:如果原样式单与包含的样式单发生冲突,将导致XSLT文档出错。
解决模板冲突的方法:使用<template.../>元素的prioprity属性,定义优先级别,默认优先级在-0.5到0.5之间。
导入另一份XSLT
<xsl:import
href = uri-reference />
注意事项:
1:原样式单里的模板优先级比导入的样式单高。
2:后导入的样式单里的模板优先级比先导入的高。
<!-- Category: instruction -->
<xsl:apply-imports />
<apply-imports.../>用于调用被覆盖的模板规则。
示例:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="article.xsl"/>
<xsl:import href="bigfont.xsl"/>
<xsl:attribute-set name="note-style">
<xsl:attribute name="font-style">italic</xsl:attribute>
</xsl:attribute-set>
</xsl:stylesheet>
XSLT模板规则
<!-- Category: top-level-element -->
<xsl:template
match = pattern
name = qname
priority = number
mode = qname>
<!-- Content: (xsl:param*, template) -->
</xsl:template>
XSLT通常是由多个模板组成,并由<template.../>元素定义。
<template.../>作用:定义一个模板替换XML中指定元素。
<template.../>使用:
1:使用match属性指定对对哪些XML节点转换。
2:转换<template.../>元素内的内容。
3:可选用mode属性来区分多个模板。
<apply-templates.../>用于处理子节点
作用:在<template.../>元素内,通知XSLT使用模板转换子节点。
可选属性:
select:指定一个XPath表达式,处理XPath表达式所代表的节点。若未指定,则依次处理当前节点集内的每个子节点。
mode:用于区分多个模板
XSLT的内置模板规则
1:匹配所有的元素节点和根节点,并处理它们:
<xsl:template match="*|/"> <xsl:apply-templates/> </xsl:template
2:匹配所有的元素节点和根节点,同时指定模式(m是一个通配符),并处理它们:
<xsl:template match="*|/" mode="m"> <xsl:apply-templates/ mode="m"> </xsl:template
3:匹配所有的文本节点和属性,并直接输出它们:
<xsl:template match="text()|@*"> <xsl:value-of select="."/> </xsl:template
4:匹配所有处理指令和注释:
<xsl:template match="processing-instruction()|comment()"/>
Values of Variables and Parameter
<!-- Category: instruction -->
<xsl:value-of
select = string-expression
disable-output-escaping = "yes" | "no" />
<value-of.../>用于输出XML节点的内容,
其支持的属性:
select:必需属性,指定一个XPath表达式,输出表达式内容对应的字符串;
disable-output-escaping:可选属性,用于是否禁用转义。
使用注意事项:
1:当<value-of.../>转换包含子节点元素的节点时,采用深度优先法则。
2:输出属性、注释、处理指令时,直接输出其内容。
示例:
name.xml
<?xml version="1.0" encoding="GBK"?> <?xml-stylesheet type="text/xsl" href="name.xslt"?> <name> <first>bruce</first> <last>zhang</last> </name>
name.xslt
<?xml version="1.0" encoding="GBK"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 匹配跟节点的模板 --> <xsl:template match="/"> <html> <head> <title>MyName</title> </head> <body> <h3>My Name</h3> <xsl:apply-templates/> <hr/> <xsl:apply-templates mode="other"/> </body> </html> </xsl:template> <!-- 定义匹配name节点的模板 --> <xsl:template match="name"> <ul> <li>first:<xsl:value-of select="first"/></li> <li>last:<xsl:value-of select="last"/></li> </ul> </xs:template> <xsl:template math="name" mode="other"> <table style="border:3px solid #666666; background-color:#999999;"> <tbody> <tr> <th>first:</th> <td><xsl:value-of select="first"/></td> </tr> <tr> <th>last:</th> <td><xsl:value-of select="last"/></td> </tr> </tbody> </table> </xsl:template> </xsl:stylesheet>