XSL(eXtensible Stylesheet Language)可扩展样式语言,主要用于将一个Xml文档转换成另外的文档(如Html文档等),以及定义转换后的文档的显示外观。XSL实际上包含了3种语言:XSL转换(XSLT)、XML路径语言(XPath)、XSL格式化对象(XSL-FO)。XSLT主要用于将一个XML文档转化为其他的XML文档或其他类型的文档。XPath主要用于识别、选择、匹配XML文档中的各个组成部分,包括元素、属性、文本内容等。XSL-FO定义了许多XML标记,这些标记描述了应如如何显示内容,XSL-FO的一个主要应用就是讲XML文档转化为PDF文件。
XSLT是基于XML的语言,这意味着XSLT文档本身就是格式良好的XML文档。<xsl:stylesheet>是XSLT的根元素,它有两个必须的属性:version和xmlns:xsl(其值为:http://www.w3.org/1999/XSL/Transform)。XSLT对源文档、结果文档和样式表文档使用同样的数据模型来操作,也就是采用同样的树形机构。不过需要注意的是,处理指令和注释在样式表中被忽略,样式表被看做既没有处理指令节点,又没有注释节点的样式表树。
XSLT样式表有一组模版规则组成,模版规则包含了两个部分:模式和模版。模式用于在源文档树中匹配(定位)节点,模版定义节点处理规则,通过模版的实例化来组成结果数的一部分。当一个模板实例化的时候,它总是相对于当前节点和当前节点列表来实例化。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="welcome.xsl"?>
<Welcome>
<Title>这是一个标题栏</Title>
<Content>这是一个内容栏</Content>
</Welcome>
welcome.xml
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match="Welcome">
<head>
<title>
<xsl:value-of select="Title"/>
</title>
</head>
<body>
<h3/>
<div>这是显示区</div>
<xsl:value-of select="Content"/>
</body>
</xsl:template>
</xsl:stylesheet>
welcome.xsl
<xsl:apply-templates>元素
<xsl:apply-templates>元素用于告诉处理器处理当前节点的所有子节点。在模版中使用该元素,告诉XSLT处理器将匹配的节点的每一个子节点(包括文本节点)与样式表中的模板规则进行比较,如果找到了匹配的模板规则,那么就可以为匹配的节点输出模版。该模版有一个select属性,使用这个属性是告诉处理器只处理子节点中的XXX节点。
<xsl:value-of>元素
该节点用于在结果树中创建一个文本节点。该元素有一个必须的属性select,用于指定要计算的表达式,表达式计算的结果被转化为一个字符串值,用这个字符串值来创建一个文本节点。
<xsl:template match="employee">
<xsl:value-of select="name"/>
</xsl:template>
<xsl:for-each>元素
该元素有一个必需的表达式select,用于指定一个表达式,该表达式计算的结果必须是一个节点集。该元素用于在一个节点集中依次选取每一个节点,被选择的节点被当成当前节点。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head/>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="employees">
<div>
<table bgcolor="#123123" border="2">
<xsl:for-each select="employee">
<tr>
<td width="100px" align="center">
<xsl:value-of select="name"/>
</td>
<td width="100px" align="center">
<xsl:value-of select="age"/>
</td>
<td width="100px" align="center">
<xsl:value-of select="month_pay"/>
</td>
</tr>
</xsl:for-each>
</table>
</div>
</xsl:template>
</xsl:stylesheet>
Mode属性
当需要对一个元素多次处理,且每次处理的结果(样式)不一致时,可以对元素<xsl:template>和<xsl:apply-templates>使用Model属性,只有这两个元素中的mode属性指定了同样的值,模版规则才会被匹配。如果<xsl:template>没有使用match属性,那么它也不能有mode属性。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head/>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="employees">
<div>第一次展示数据:
<table border="1">
<tbody>
<xsl:apply-templates select="employee" mode="table"/>
</tbody>
</table>
</div>
<br/>
<div>第二次展示数据:
<xsl:apply-templates select="employee" mode="list"/>
</div>
<div>第三次展示数据:
<table bgcolor="#123123" border="2">
<xsl:for-each select="employee">
<tr>
<td width="100px" align="center">
<xsl:value-of select="name"/>
</td>
<td width="100px" align="center">
<xsl:value-of select="age"/>
</td>
<td width="100px" align="center">
<xsl:value-of select="month_pay"/>
</td>
</tr>
</xsl:for-each>
</table>
</div>
</xsl:template>
<xsl:template match="employee" mode="table">
<tr>
<td width="100px" align="center">
<xsl:value-of select="name"/>
</td>
<td width="100px" align="right">
<xsl:value-of select="age"/>
</td>
<td width="100px" align="right">
<xsl:value-of select="month_pay"/>
</td>
</tr>
</xsl:template>
<xsl:template match="employee" mode="list">
<ul>
<li>
<xsl:value-of select="name"/>
</li>
<li>
<xsl:value-of select="age"/>
</li>
<li>
<xsl:value-of select="month_pay"/>
</li>
</ul>
</xsl:template>
</xsl:stylesheet>