什么是xsl

 XSL(EXtensible Stylesheet Language)它是指可扩展样式表语言。 XSL之于 XML 就像 CSS 之于 HTML。说白了就是将XML中的数据用指定的显示格式输出.XML不像HTML,它不包含任何显示格式的信息. XSL 包含两个部分:
  • XSLT – 用于转换 XML 文档的语言. XSLT 是指 XSL 转换 (XSL Transformation)
  • XPath – 用于在 XML 文档中导航的语言

XSL 语法

任何 XSL 文档的第一行实际上都是 XML 声明:

<?xml version="1.0" encoding="GB2312"?>

XSL 与 XML ?遵循相同的语法规则
在 XML 声明之后,就是 XSL 声明,例如:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
......
</xsl:stylesheet>

XSL声明必须要有结束标签,上面的声明中还包含命名空间和 XSL 规范的版本。

什么是命名空间

它 指定一组可以在特定文档中使用的元素名称和属性名称。命名空间的作用是避免命名冲突。由于 XML 和其它与 XML 相关的语言都是用户定义的,所以可能出现命名冲突。<table>可能是指一个布局或是一个座位。由于大多数应用程序同时处理多个 XML 文档,因此经常会有不同 XML 文档相混合的情况,而在这些文档中某个元素可能代表不同的含义。几个文档使用相同的命名空间可以确保元素在每个文档中代表相同含义。否则,就应该使用不同 的命名空间确保元素代表不同的含义。

命名空间由文档声明中的 xmlns 属性指定,实际上就是网站的地址(例如 http://www.w3.org/1999/XSL/Transform)。其基本原理是 URI 具有唯一性,因此相应的命名空间也是唯一的。文档声明中的 URI 仅用作名称。

模板或规则
XSL 文档是由模板或规则构成,每个模板定义应用于特定 XML 节点的规则。XSL 模板如下所示:

<xsl:template match="/">......</xsl:template>

模板的作用是用来承载XML文档中的数据的,就像一个模具,如果这个模具是方形的,那么用这个模具做出来的模型也一定是方形的,而XML文档中的数据就是用来真充模具的原料。实际上在模板中可以嵌套子模板,但最上层模板必须将match设为"/"。
happyold.xml

<?xml version="1.0" encoding="GB2312"?>
<俱乐部>
<会员>    
<姓名>cnbruce </姓名>
<年龄>10 </年龄>
<性别>男 </性别>
<描述>他是一个糟糕的家伙!</描述>
</会员>
<会员>
<姓名>yufuzi</姓名>
<年龄>80 </年龄>
<性别>男 </性别>
<描述>他是一个优秀的男人!</描述>
</会员>
<会员>
<姓名>xiaojin</姓名>
<年龄>20 </年龄>
<性别>男 </性别>
<描述>他人品有问题!</描述>
</会员>
</俱乐部>


循环构造

<xsl:for-each select="...">......</xsl:for-each>

与典型的 for 循环作用相同。
old.xsl

<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<table border="1">
<tr>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>描述</th>
</tr>
<xsl:for-each select="俱乐部/会员">
<tr>
<!--表达式为何不需要包括父节点或从文档根开始。这是因为这些元素的路径是根据 <xsl:for-each> 构造中的 XPath 表达式来计算的-->
<td><xsl:value-of select="姓名"/></td>
<td><xsl:value-of select="年龄"/></td>
<td><xsl:value-of select="性别"/></td>
<td><xsl:value-of select="描述"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

将old.xsl与happyold.xml放到同一文件夹下,然后在happyold.xml第二行插队入

<?xml-stylesheet type="text/xsl" href="old.xsl"?>

然后在浏览器中预览一下显示结果。

使用循环构造,还可以根据条件过滤输出。假设只想显示会员中年龄大于30的会员。
old30.xsl

<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<table border="1">
<tr>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>描述</th>
</tr>
<xsl:for-each select="俱乐部/会员[年龄>30]">
<tr>
<td><xsl:value-of select="姓名"/></td>
<td><xsl:value-of select="年龄"/></td>
<td><xsl:value-of select="性别"/></td>
<td><xsl:value-of select="描述"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

要定义 XML 节点的条件,可以使用下列任何运算符:

等于 (=)
不等于 (!=)
小于 (<)
小于或等于 (<=)
大于 (>)
大于或等于 (>=)


使 用<xsl:sort / >构造使输出的结果按指定的节点进行排序,<xsl:sort /> 元素必须嵌套在 <xsl:for-each > 元素中,以确保应用程序可以循环通过所有的项目。sort 元素没有相应的结束标签,所以在其结尾加上"/"使其自结束。
old_sort.xsl

<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<table border="1">
<tr>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>描述</th>
</tr>
<xsl:for-each select="俱乐部/会员">
<xsl:sort select="年龄" order="descending"/>
<tr>
<td><xsl:value-of select="姓名"/></td>
<td><xsl:value-of select="年龄"/></td>
<td><xsl:value-of select="性别"/></td>
<td><xsl:value-of select="描述"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

去掉order="descending"再看看显示结果。

条件构造:

<xsl:choose>
<xsl:when test="表达式">

</xsl:when>
<xsl:otherwise>

</xsl:otherwise>
</xsl:choose>

条件构造中可以有多个when,但只能有一个otherwise,用于处理未包括在初始测试条件中的所有其它情况.
old_choose.xsl
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<table border="1">
<tr>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>描述</th>
</tr>
<xsl:for-each select="俱乐部/会员">
<xsl:choose>
<xsl:when test="年龄 > 70">
<tr bgcolor="#66CCFF">
<td><xsl:value-of select="姓名"/></td>
<td><xsl:value-of select="年龄"/></td>
<td><xsl:value-of select="性别"/></td>
<td><xsl:value-of select="描述"/></td>
</tr>
</xsl:when>
<xsl:when test="年龄=10">
<tr bgcolor="blue">
<td><xsl:value-of select="姓名"/></td>
<td><xsl:value-of select="年龄"/></td>
<td><xsl:value-of select="性别"/></td>
<td><xsl:value-of select="描述"/></td>
</tr>
</xsl:when>
<xsl:otherwise>
<tr bgcolor="red">
<td><xsl:value-of select="姓名"/></td>
<td><xsl:value-of select="年龄"/></td>
<td><xsl:value-of select="性别"/></td>
<td><xsl:value-of select="描述"/></td>
</tr>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
### XSL 的定义与用途 XSL 是 **Extensible Stylesheet Language**(可扩展样式表语言)的缩写,主要用于转换和格式化 XML 数据。它由多个部分组成,其中最核心的部分是 XSLT(Extensible Stylesheet Language Transformations),用于将一种 XML 文档转换成另一种结构化的文档,比如 HTML 或其他形式的 XML。 #### 定义 XSL 是一组技术的集合,旨在处理 XML 数据的表现层和转换逻辑。其主要组成部分包括: - **XSLT**: 负责将源 XML 文档转换为目标格式的工具[^1]。 - **XPath**: 提供了一种查询机制,允许开发者定位 XML 文档中的特定节点或数据片段。 - **XSL-FO (Formatting Objects)**: 主要关注于描述打印或呈现的内容布局方式。 #### 作用 XSL 的主要功能可以概括如下: 1. **XML 数据转换**: 使用 XSLT 可以实现从原始 XML 数据到目标格式(如 HTML、纯文本或其他 XML 结构)的高效转换。这种能力使得 XSL 成为了跨平台数据交换的重要手段之一。 2. **模板匹配与规则应用**: 在 XSL 中通过 `<xsl:template>` 元素定义模版来指定如何处理不同类型的节点。这些模版可以根据条件动态调整输出内容。 3. **增强表现力**: 配合 CSS 和 JavaScript 技术栈,能够进一步提升基于浏览器端展示效果的质量;而借助 FO,则能生成高质量印刷品级 PDF 文件等静态资源。 4. **灵活高**: 支持多种编程范式(函数式编程风格尤为突出)、强大的模式匹配以及内置丰富的库函数支持复杂计算需求。 以下是简单的 XSLT 示例代码演示如何把一段基本的 XML 转换成 HTML 页面: ```xml <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html"/> <!-- 匹配根元素 --> <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="catalog/cd"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> ``` 此脚本会读取名为 `catalog` 的 XML 列表并将其渲染为带有表格样式的网页视图。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值