Jun 25

[原]用XSLT转换XML 阴

linuxing , 14:20 , 编程 » (X)HTML , 评论(0) , 引用(0) , 阅读(20316) , Via 本站原创 | |
    XSL全称是eXtensible Stylesheet Language,即可扩展样式表语言,这是一种通过可读格式呈现XML数据的语言。XSLT则是指XSL Transformation,即XSL转换,它是XSL的重要部分,用于转换XML文档。
    由于XML标记是用户定义的,浏览器不知道如何解析或呈现每个标记,必须通过XSLT把每个XML元素转换为HTML元素,从而把XML文档转换为HTML文档并通过浏览器呈现给用户。

一、XSL文档的创建和应用
若要使用XSLT来格式化显示一个XML文档,需要为该XML文档创建一个XSL样式表文档,然后把该样式表链接到XML文档。
1、创建XSL文档
XSL样式表文档是扩展名为.xsl 的文本文件,也是一个结构完整、格式良好的XML文档,其基本结构如下:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
  <!-- 一些控制XML元素显示的规则 -->
  </xsl:template>
  ...
</xsl:stylesheet>

其中,第一行是XML文档声明;第二行<xsl:stylesheet表示XSL样式表声明的开始,每个XSL文档都包含这样一个xsl:stylesheet 元素;xsl是XSL名称空间的前缀,该名称空间的URI是http://www.w3.org/1999/XSL/Transform 。
接下来使用<xsl:template>...</xsl:template>定义一个模板,match属性指定该模板所匹配的XML元素,match="/"表示该模板与XML文档的根元素匹配,一个XSL文档至少包含这样一个模板。在模板代码中既可以使用包含xsl:前缀的XSL标记,也可以使用普通的HTML标记,用于规定XML文档中所有匹配元素的输出内容和输出格式。

2、引用XSL文档
创建XSL文档后,即可在XML文档中引用该XSL文档。为此,需要在XML文档序言部分添加一个xml-stylesheet指令,语法是:

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

其中,href属性指定要引用的XSL文件的位置。

二、XSL模板设计
模板是XSL文档的重要组成部分。每个XSL文档至少包含一个与根节点匹配的模板。实际上,一个XSL样式表就是由若干个模板组成的,每个模板用于定义XML文档中特定节点元素的输出格式和内容。
1、XML模板指令
定义模板的格式语法是:

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

match属性用于指定XML文档树结构中的特定节点,其属性值也称为模式(pattern)。在XML文档中,只有与指定模式匹配的节点才会被当前模板处理。这些模式有:
引用
a、“/”,表示模板与根节点匹配;
b、“node”,表示模板与所有node元素匹配;
c、“node1|node2”,表示模板匹配所有node1元素和所有node2元素;
d、“node1/node2”,表示模板匹配所有以node1为父节点的node2元素;
e、“*”,表示模板匹配所有未单独指定处理规则的元素节点。

在XSL模版中,可以使用XSL标记、XML节点名称、HTML标记以及普通字符串等内容,其中的XSL标记包含“xsl”前缀,这些标记通常用做XML控制指令,例如条件判断指令和循环指令等。

2、XSL选取值输出指令
在某个XSL模板中,可以使用<xsl:value-of>标记指令把XML文档中元素的文本值写到输出文档中,语法格式如下:

<xsl:value-of select="elementname" />

其中,select属性用于选择被提取值的节点元素,该属性值为所选元素的名称。

3、XSL模板应用指令
在XSL文档中定义一个模板后,可以在同一文档中的另一个模板中应用该模板,语法是:

<xsl:apply-templates select="pattern" />

其中,select属性用于指定XML文档树结构中的一个特定节点,对该节点定义的模板将被调用。若省略select属性,则会处理当前节点的每个子节点所对应的模板(若有的话)。
XSL模板应用指令总是包含在<xsl:template>与</xsl:template>标记之间,即位于一个模板定义的代码块内部。执行该指令时,将通过指定模板对每个匹配的节点元素逐个进行处理,并把所生成的HTML代码放在该指令所在位置。(即把模板定义与其存放的位置独立定义)

三、用XPath选择XML节点
XPath是XSLT的重要组成部分。一个XPath表达式由上下文节点和节点模式两部分组成,前者提供节点模式开始的位置,后者则是由一个或多个节点选择器组成的字符串。在设计XSL模板时,可以使用XPath表达式从XML文档中检索所需要的节点或节点集。
1、通过元素名选择节点
元素名是最简单的XPath表达式,通过元素名可以直接访问当前节点的子节点元素。
引用
a、用<xsl:template>标记创建处理某节点的模板时,通过match属性指定元素名;
b、用<xsl:apply-template>标记应用处理某节点的模板时,通过select属性指定元素名;
c、使用<xsl:value-of>标记选取输出某元素内容时,通过select属性指定元素名。

2、通过匹配符选择节点
在XPath表达式中可以通过匹配符选择节点,通常的情况有:
引用
a、“/”选择根节点;
b、“/*”选择根元素;
c、“.”选择当前节点;
d、“..”选择当前元素的父节点。

3、通过路径选择节点
由于XML文档中的所有元素具有明确的层次结构,因此在XPath表达式中可以通过绝对路径或相对路径来选择XML文档中的某个元素。
例如,title节点的绝对路径为“/books/book/title”,若当前节点为“books”,则title节点的相对路径可表示为“book/title”;
若当前节点为title,则上一层节点的相对路径可表示为“../isbn”。
通过把适当的XPath表达式应用于match属性或select属性,即可从文档中选择所需的节点元素。
在XPath表达式中,还可以使用以下两个特殊符号:
引用
a、使用星号“*”表示路径中任意节点元素名称;
b、使用双斜线“//”表示任意多层的节点元素名称。(只要匹配元素名就行)

4、通过附加条件选择节点
使用XPath表达式选择XML节点时,可以为其添加筛选条件。在XPath表达式中,所添加的筛选条件需要用方括号括起来:
引用
a、附加子元素条件,例如选择具有title子元素的book元素,表示为“book[title]”;
b、附加指定属性条件,例如选择具有studentno属性的student元素,表示为“student[@studentno]”,甚至更严格的“student[@studentno='20070101']”;
c、附加指定字符串条件,例如选择gender子元素内容为“男”的student元素,表示为“student[gender='男']”。

5、选择元素属性
若要选择和输出XML元素的属性内容,可定义为:

@attribute

attribute就是元素的属性名称。

四、XSL控制指令
在XSL文档中,可以使用一些特定的标记作为指令来控制对XML元素的处理流程。
1、单一条件判断指令
使用<xsl:if>对条件表达式进行测试,并根据测试结果决定是否执行指定的操作,语法是:

<xsl:if test="表达式">
  ...
</xsl:if>

在测试表达式中可以使用元素名称和属性名称(以@开头),条件运算符则有:&lt(小于)、&gt(大于)、=(等于)、!=(不等于)。而用于比较的字符串应放在单引号里面,例如<xsl:if test="gender='男'">。

2、多分支判断指令
在XSL模版中,可以把<xsl:choose>、<xsl:when>和<xsl:otherwise>组合起来构成多分支判断指令,用于对多个条件表达式进行测试,语法是:

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

执行多分支判断指令时,将按顺序依次测试由每个test属性指定的条件表达式,若某个条件表达式成立,则执行相应的样式定义语句;若所有test属性指定的条件表达式都不成立,则执行<xsl:otherwise>块的样式定义语句。

3、循环处理指令
在XSL模板中,可以使用循环处理指令<xsl:for-each>来遍历指定的节点集合,语法是:

<xsl:for-each select="pattern">
<xsl:sort select="pattern"
    data-type="number"|"text"
    order="ascending"|"descending" />
  <xsl:value-of select="pattern" />
  ...
</xsl:for-each>

其中,<xsl:for-each>标记的select属性指定需要循环输出的节点。而<xsl:sort>标记是个可选项,用于指定节点数据的排序方式。select属性指定作为排序依据的元素或属性;data-type属性指定用做排序依据的元素或属性的数据类型,number表示数字类型,text表示文本类型;order属性指定排序方向,ascending表示升序,descending表示降序。<xsl:value-of>标记指定输出的子节点内容。

五、举例
XML源码:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="doc09-01.xsl" ?>
<source>

<title>XSL</title>
<author>John Smith</author>

</source>

XSL源码:

<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="/">
     <h2>
          <xsl:value-of select="//author"/>
     </h2>
     <h1>
          <xsl:value-of select="//title"/>
     </h1>
</xsl:template>
</xsl:stylesheet>

浏览器中查看的结果:
点击在新窗口中浏览此图片

※ 后记:XSLT要完成的工作,相当于把XML看作一个数据库,从中根据pattern模式提取指定的数据,然后输出到已经创建好的html模板格式中(可补充定义CSS样式)。可见,该操作并不是必须的,有很多方式可以完成这个操作,例如JavaScript或服务器脚本等。但使用XSLT可在不改动XML的数据结构的情况下,提供格式化的HTML显示。

六、参考资料
XSLT 是什么类型的语言
Tags: ,
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]