XML和XSLT 博客分类: Technology & Theory XMLXSLIBM数据结构ASP
XML: Extensible Markup Language 可扩展标记语言
1、XML相关知识
XML是从1996年开始有其雏形,并向 W3C(全球信息网联盟)提案,而在1998二月发布为W3C的标准(XML1.0)。 XML的前身是SGML(The Standard Generalized Markup Language),是自IBM从60年代就开始发展的 GML(Generalized Markup Language)标准化后的名称。
DTD,XML文件的文件类型描述(DTD)可以看成一个或者多个XML文件的模板,在这里可以定义XML文件中的元素、元素的属性、元素的排列方式、元素包含的内容等等。 Document type Definition(文档类型定义),它为一个XML文档或者文档集合建立一套规则。它本身不是独立的技术规范,而是属于规范的一部分,XML文档中的文档类型声明既可以是标记约束,也可以是带有标记约束的外部文档。这两种约束的总和就是DTD。它规定了XML文档的构建方式。
XML Schema,XML Schema描述了XML文档的结构。可以用一个指定的XML Schema(通常以xsd扩展名结尾)来验证某个XML文档,以检查该XML文档是否符合其要求。如果符合的话,那么该XML文档被称为是有效的(valid),否则它就是非有效的(invalid)。可以通过XML Schema指定一个XML文档所允许的结构和内容,并可据此检查一个XML文档是否是有效的。
XML Schema不是唯一的描述XML结构化文档的方法,相类似的技术还有DTDs和RNG Schema。
XSD是XML Schemas Definition的缩写,也是XML Schema文件的扩展名。
2、XML示例
有三个通用术语用来描述 XML 文档的组成部分:标记、元素和属性。XML是被设计用来存储数据、携带数据和交换数据的。
命名空间
它指定一组可以在特定文档中使用的元素名称和属性名称。命名空间的作用是避免命名冲突。命名空间由文档声明中的 xmlns 属性指定,实际上就是网站的地址(例如 http://www.w3.org/1999/XSL/Transform)。其基本原理是 URI 具有唯一性,因此相应的命名空间也是唯一的。文档声明中的 URI 仅用作名称。
XSLT: Extensible Stylesheet Language Transformation 可扩展样式表语言转换
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 规范的版本。
模板或规则
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>
然后在happyold.xml第二行插队入 <?xml-stylesheet type="text/xsl" href="old.xsl"?>,然后在浏览器中预览一下显示结果。
使用循环构造,还可以根据条件过滤输出。假设只想显示会员中年龄大于30的会员。
- <?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>
条件构造:
- <xsl:choose>
- <xsl:when test="表达式">
- </xsl:when>
- <xsl:otherwise>
- </xsl:otherwise>
- </xsl:choose>
条件构造中可以有多个when,但只能有一个otherwise,用于处理未包括在初始测试条件中的所有其它情况.
- <?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>
参考:
http://wiki.ccw.com.cn/XML XML
http://www.itisedu.com/phrase/200604231236585.html XML
http://dsp.blueidea.com/book/study/xml/04html/index.asp XSLT
http://www.ibm.com/developerworks/cn/xml/newto/ XML 新手入门
http://www.ibm.com/developerworks/cn/xml/tips/x-tipxsltjx/index.html 根据 XML 内容设置 XSL 样式表