XSL 指扩展样式表语言(EXtensible Stylesheet Language)。
万维网联盟 (W3C) 开始发展 XSL 的原因是:存在着对于基于 XML 的样式表语言的需求。
说白了就是友好的去显示一个xml文档
XSL - 不仅仅是样式表语言
XSL 包括三部分:
XSLT
一种用于转换 XML 文档的语言。
XSLT 是 XSL 中最重要的部分。
XSLT 用于将一种 XML 文档转换为另外一种 XML 文档,或者可被浏览器识别的其他类型的文档,比如 HTML 和 XHTML。通常,XSLT 是通过把每个 XML 元素转换为 (X)HTML 元素来完成这项工作的。
通过 XSLT,您可以向或者从输出文件添加或移除元素和属性。您也可重新排列元素,执行测试并决定隐藏或显示哪个元素,等等。
描述转化过程的一种通常的说法是,XSLT 把 XML 源树转换为 XML 结果树。
XPath
一种用于在 XML 文档中导航的语言。
XSL-FO
一种用于格式化 XML 文档的语言。
正确的样式表声明
把文档声明为 XSL 样式表的根元素是 <xsl:stylesheet> 或 <xsl:transform>。
<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"
指向的是xslt的官方命名空间,如果引入和这个命名空间那就要包含属性 version="1.0"。
从一个原始的 XML 文档开始
我们现在要把下面这个 XML 文档转换为 XHTML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<user>
<name>张三</name>
<age>12</age>
<pwd>123</pwd>
<sex>男</sex>
</user>
</root>
创建 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>用户信息</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left">用户名</th>
<th align="left">密码</th>
</tr>
<xsl:for-each select="root/user">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="pwd"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
把 XSL 样式表链接到 XML 文档
现在xsl (显示格式)和xml(数据)都有了 怎么把他们两个链接到一起呢
向 XML 文档添加 XSL 样式表引用:
<?xml-stylesheet type="text/xsl" href="xsl的文件"?>
这里我对咱们上个例子的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="/">//XSL 样式表由一个或多套被称为模板(template)的规则组成。每个模板含有当某个指定的节点被匹配时所应用的规则。
match 属性的值是 XPath 表达式(举例,match="/" 定义整个文档)。意思也就是匹配xml文件的(从根开始)
<html>
<body>
<h2>用户信息</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left">用户名</th>
<th align="left">密码</th>
</tr>
<xsl:for-each select="root/user"> //<xsl:for-each> 元素可用于选取指定的节点集中的每个 XML 元素。
select 属性的值是一个 XPath 表达式。此表达式的工作方式类似于定位某个文件系统,在其中正斜杠可选择子目录。
<xsl:for-each> 元素还可以加过滤<xsl:for-each select="root/user[age='12']"> (意思取的是子节点当中年龄12的)
合法的过滤运算符:
:= (等于)
:!= (不等于)
:< (小于)
:> (大于)
<xsl:sort select="age"/> //如需对结果进行排序,只要简单地在 XSL 文件中的 <xsl:for-each> 元素内部添加一个 <xsl:sort> 元素:
<xsl:sort select="age"/>
<xsl:if test="age > 10"> //如需添加有条件的测试,请在 XSL 文件中的 <xsl:for-each> 元素内部添加 <xsl:if> 元素
test
:意思是条件
<tr>
<td><xsl:value-of select="name"/></td> //<xsl:value-of> 元素,<xsl:value-of> 元素用于提取某个选定节点的值,并把值添加到转换的输出流中:
select 属性的值是一个 XPath 表达式。此表达式的工作方式类似于定位某个文件系统,在其中正斜杠可选择子目录。
当我在 <xsl:for-each> 元素可省略从根节点找直接在 <xsl:for-each> 元素下面找
<td><xsl:value-of select="pwd"/></td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
还可以添加多重判断
<?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>用户信息</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left">用户名</th>
<th align="left">密码</th>
</tr>
<xsl:for-each select="root/user">
<tr>
<xsl:choose>
<xsl:when test="age > 20"> //多重判断 判断我的年龄大于20那么就在醒目右面加一个男人
<td>
<xsl:value-of select="name"/><h6>男人</h6>
</td>
</xsl:when>
<xsl:when test="age < 20 ">
<xsl:value-of select="name"/><h6>男孩</h6>//如果是20以下加一个男孩
</xsl:when>
<xsl:otherwise> //入伙上面两种都不是就加一识别不了
<xsl:value-of select="name"/><h6>识别不了年龄</h6>
</xsl:otherwise>
<td>
<xsl:value-of select="pwd"/>
</td>
</tr>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XPath 语法
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
下面列出了最有用的路径表达式:
nodename:选取此节点的所有子节点。
/ : 从根节点选取。
// :从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. :选取当前节点。
:选取当前节点的父节点。
.. :选取当前节点的父节点
@ : 选取属性。