Michael's Space

Technology changes the world, serves the people.
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

XSLT浅谈

Posted on 2006-09-24 16:02 奔跑的阿甘 阅读(612) 评论(0)  编辑 收藏 引用 所属分类: XML/Data Service

XSLT浅谈
Michael 2006/09/24

在"XML浅谈"一章,曾提到XML文档的内容可由XSLT经过转化处理后呈现给用户,今天我们着重讨论如何做到这点。
掌握XSLT需要牢记以下三条法则:
1.XSLT本身就是XML文档
2.XSLT转化后需要显示的内容由用户决定
3.XSLT转化的内容如何显示由用户决定

一 XSLT本身就是XML文档

这意味着,编写XSL文件和编写一份普通的XML文档没什么区别。它需要有且仅有一个根结点,它的每个元素需要前后对称,等等。这些XML
文档的编写规范就是XSL的编写规范。
XSL文档的根节点是<xsl:stylesheet>,一般地,所有XSL文档的根结点描述为:
<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
注意:用来定义xsl名字空间的URI地址是大小写相关的。
以下为本章示例XML文档book.xml:
<?xml version="1.0"?>
<?xml:stylesheet type="text/xsl" href="book.xsl"?>
<source>
<book id="001">
     <price>USD100</price>
     <page>1000</page>
     <book id ="002">partII</book>
</book>
</source>

二 XSLT转化后需要显示的内容由用户决定

XSLT是面向规则或者面向模板(TEMPLATE-ORIENTED)的语言,它定义一系列的针对源XML文档节点的规则,用于替换指定的XML文档节点
,最终生成的文档就是用户希望看到的内容。
所以,通过编写适用于特定节点的规则,这些节点就根据规则定义的格式呈现出来。
如果用户不希望看到某部分内容,只要不对这些内容节点制定规则,它们就不被显示。
在XSLT中,<xsl:template>元素用于制定一个规则,这条规则可适用于XML树的某个节点也可适用于多个节点,它可由元素的"match"属
性指定。
这种T-O方法允许用户自行定义灵活的表单生成各式各样的效果。
例如:
<xsl:template match="/">
     <xsl:apply-templates select="//book"/>
</xsl:template>

上述规则的含义是:
1)经过该XSL转化后的文档仅包含book元素
2)该book元素可以是任一节点的book元素

三 XSLT转化的内容如何显示由用户决定

如何显示指定节点,也就是如何制定规则(TEMPLATE)的过程。
规则的内容就是如何定义样式,它可以是HTML的元素,或者XSLT本身定义的元素(如<xsl:value-of>,<xsl:text>等)。
例如:
<xsl:template match="book">
     <h3 style="color:blue">
          <xsl:value-of select="name()"/>
          <xsl:text> (id=</xsl:text>
          <xsl:value-of select="@id"/>
          <xsl:text>)</xsl:text>
     </h3>
</xsl:template>

上述规则的含义是:
1)这条规则对XML树的book节点进行转换
2)转换后的内容显示如下(蓝色3号大小):
book (id=001)
book (id=002)

XSLT中对同一个XML节点可以定义多条规则(由mode属性或者按优先级选择等),同时,一条规则可以适用于多个XML节点(设置"match" 属性时采用"|"运算符连接多个节点等)。

最后,对于XML分析器转换XML文档时的过程简单总结一条:
分析器从根节点开始遍历XML文档,对每个节点,从XSL文档中寻找规则,若找到则进行节点转换,否则继续遍历,直到整颗树遍历完毕为止。在进行父节点转换时,如果XSL也定义了该父节点的某个子节点的规则,则需要检查是否有<xsl:apply-templates>元素,若没有则整个父节点(包括所有子节点)都将被父节点的规则替换,若有,则需要对该元素指定的子节点或者对所有子节点采用各自的规则进行替换。

【完】


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理