XSLT——XML样式表转换语言

前端之家收集整理的这篇文章主要介绍了XSLT——XML样式表转换语言前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

XML样式表转换语言

1. XSLT是XSLTransformations的缩写,它是XSL的一个组成部分。

XSL(EXtensible StyleSheet)由三部分组成:

– XSLT。XSLT的作用是将一个XML文档转换为另一种类别的XML文档(也包括HTML文档)。

– XPath。XPath的作用是指定访问XML数据的寻址路径表达式。

– XSL-FO(XSL Formatting Objects)。XSL-FO的作用是对XML文档中的数据排版

2. XSLT工作原理:将如下XML文档转换为HTML文档

<?xml version="1.0" encoding="GBK" ?>
<?xml-stylesheet type="text/xsl" href="books.xsl" ?>
<books>
  <book category="TP18">
    <title lang=”cn”>人工智能及其应用</title>
    <authors>
      <author>蔡自兴</author>
      <author>徐光祐</author>
    </authors>
    <ISBN>7-302-02127-9</ISBN>
    <date>1996年5月</date>
<publisher>清华大学出版社</publisher>
<price>32.50</price>
  </book>
</books> 

相应的XSLT文档:

 <?xml version="1.0" encoding="GBK" ?>
 <xsl:stylesheet version="1.0 "  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template  match="/books/book">
   <table border="1">
   <tr>
      <td bgcolor="#9acd32">标题</td>
      <td><xsl:value-of select="title" /></td>
   </tr>  
   <tr>
      <td bgcolor="#9acd32">作者</td>
      <td><xsl:for-each select="authors/author">
                <xsl:value-of select="." /> <![CDATA[   ]]>
              </xsl:for-each> </td>
   </tr>
   <tr>
      <td bgcolor="#9acd32">出版社</td>
      <td><xsl:value-of select="publisher" /></td>
   </tr> 
  </table>
   <br/>
 </xsl:template>
 </xsl:stylesheet> 

转换后产生的HTML文档:
<table border="1">
   <tr> <td bgcolor="#9acd32">标题</td>
           <td>人工智能及其应用</td> </tr>  
   <tr><td bgcolor="#9acd32">作者</td>
          <td>蔡自兴 徐光祐</td> </tr>
   <tr> <td bgcolor="#9acd32">出版社</td>
           <td>清华大学出版社</td> </tr>
</table>

3. XSLT工作原理

4.将XML转换为HTML

• 要将XML文档转换为HTML,除了要进行转换的XML文件本身之外,还需要一个指定转换规则的XSLT文件,此外,还必须在XML文件中指出对应的XSLT文件的URL。

• 在XML文件中,必须在开头放置一条处理指令,其格式为:

<?xml-stylesheettype=“text/xsl” href=”your-xsl-file-URL”?>

• 在XSLT文件其根元素必须是stylesheet,并且必须声明XSLT的命名空间,为这个空间指定前缀,例如:

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

• 可在IE浏览器上直接打开XML文件,IE包含的XSLT处理器将按照XSLT文件中的指令对XML文件进行转换,并将转换的结果显示在窗口上。

5.XML文档结构树 ML文档的数据结构是树形结构,XSLT事实上可以认为是将一颗XML树转换为另一颗不同结构的XML树。

无论一棵XML树结构如何复杂,它都是由如下7种结点构成的:

1.文档根结点,这是一个代表整个XML文档的结点。/

2. 元素结点,XML文档中每一个元素对应一个元素结点。

3. 文本结点,包含在一个元素中的文字对应一个文本结点,如果其中出现CDATA片断,则CDATA片断中的文字也包含在这个文本结点中。

4. 属性结点,一个元素如果包含属性,则每一个属性对应一个属性结点。

5. 处理指令结点,XML文档中每一条处理指令对应一个处理指令结点。

6. 注释结点,XML文档中每一个注释标记对应一个注释结点。

7. 命名空间结点,对应命名空间的结点,注意并非XML文档中出现几个命名空间,就对应几个命名空间结点,而是有数量多得多的命名空间结点。命名空间结点依附于元素结点,一个元素处于哪些命名空间的作用域内,这个元素结点就拥有哪些命名空间结点,一个命名空间对应一个结点。

XSLT不处理命名空间结点,因此XSLT所处理的结点只有6种,其中最重要的是文档根结点、元素结点、文本结点和属性结点。

6.模板和指令

  1. 模板:xsl:template
  2. 取值:xsl:value-of
  3. 循环:xsl:for-each
  4. 过滤和排序
  5. 选择:xsl:if
  6. 多分支选择:xsl:choose
  7. 模板的应用:xsl:apply-templates
  8. 默认模板
  9. 对源文档结点的处理次序

(1)模板:xsl:template

•XSLT的转换规则由若干个模板构成,每个模板利用XPath表达式指定应用的结点,当XML文档中的结点与指定的结点匹配时,就应用这个模板。

•模板的常见形式为 :

<xsl:templatematch=“pattern” >

… … <!-- 模板的内容 -->

</xsl/template>

其中pattern为XPath表达式。

•模板存放在XSLT文档中,XSLT处理器将从文档根结点开始搜索源文档树中的结点,一旦发现某个结点有匹配的模板,则该结点及其子树(以该结点为树根的子树)就由该模板处理。

•模板的内容指出如何处理所匹配子树中的结点,其中包括直接输出标记(非XSLT命名空间的标记)和XSLT指令(XSLT命名空间的标记)。

模板的XPath表达式举例:

/与根结点匹配。

*与任何元素和属性结点匹配。

chapter/parachapter结点的子结点para匹配。

@id,与属性idchapter[@id=”1”]属性的值为1的结点.当前结点。

例如:

<xsl:template match=”/books/book” >

<xsl:template match=”/books/book[@category=’TP312’]” >

方括号中的布尔表达式称为“谓词”,它表示一个过滤条件,只有满足过滤条件的结点才被过滤出来作为匹配结点。

(2)取值:xsl:value-of

•xsl:value-of可用来取出结点的字符串值。

•常用形式:

<xsl:value-of select=”pattern”/>

•例如:

<xsl:value-of select=”title” >

<xsl:value-of select=”title/@lang” >

(3)循环:xsl:for-each

•常用形式 :

<xsl:for-eachselect=”pattern” >

… <!-- 对pattern所匹配结点的处理-->

</xsl:for-each>

通常pattern匹配多个结点,xsl:for-each将对所匹配的每个结点执行一遍。

•例如:

<xsl:for-eachselect=”/books/book” >

… <!-- 处理每个book结点 -->

</xsl:for-each>

For-each示例:

一本书可以有多个作者,我们可以循环地取出每个作者的姓名:

<xsl:for-each select=”authors/author”>

<!-- 对authors的每个author结点循环处理 -->

<xsl:value-ofselect=”.” />

<!-- 当前结点就是author,得到作者姓名 -->

<![CDATA[ ]]>

<!-- 此处放一个空格,隔开作者姓名 -->

</xsl:for-each>

(4)过滤

•在用于select的XPath表达式中使用谓词可以实现过滤。

谓词由一对方括号括起来,其中是一个表示条件的等式或不等式,只有满足条件的结点才被选中。

•例如,只显示出某个出版社出版的书籍:

<xsl:template match=“/books/book[publisher=‘清华大学出版社’]” >

•用于过滤表达式的一些运算符:

=,等于 !=,不等于 &lt; 小于 &gt; 大于 注意大于、小于不能用“>”和“<”

排序:

•排序要使用<xsl:sort>元素 。

•<xsl:sort>可作为<xsl:for-each>或<xsl:apply-templates>的子元素使用,从而使循环处理的结果按指定的次序排序。

•默认的情况下,排序是按升序次序的,如果要改变,可使用<xsl:sort>的属性order,其属性值为ascending或descending。例如,使标题按降序排列:

<xsl:sortselect="title“order="descending" />

排序示例1:按书本标题排序:
<xsl:template match="/">
  <html>
    <body>
       <table>
       <xsl:for-each select="/books/book">
        <xsl:sort select="title" /> 
        <tr>
        <td><xsl:value-of select="title" /></td>
        </tr>
       </xsl:for-each>
       </table>
    </body>
  </html> 
</xsl:template> 

排序示例2:
•也可以按属性值排序 ,例如:
 <xsl:for-each select="/books/book">
   <xsl:sort select="@category"  />
   <tr><td>
     <xsl:value-of select="title" />
     :category is
       <xsl:value-of select="@category" />
   </td></tr>
 </xsl:for-each> 
•如果按价格排序,由于价格是数字,最好指出所排序的数据是数字 :
 <xsl:sort select="price" data-type="number" /> 
data-type的属性值可取“text”或“number”。

5.选择:xsl:if

• xsl:if可用来设定一个条件,只对满足条件的数据进行处理。

• 一般应用形式为:

<xsl:iftest=boolean-expression >

<!–

此处对满足条件的数据进行转换处理

-->

</xsl:if>

• 其中boolean-expression是一个布尔表达式,用来表示条件。

选择举例:ibri;ms"Cni`�X�nt:minor-latin'>注释结点,XML文档中每一个注释标记对应一个注释结点。

7. 命名空间结点,对应命名空间的结点,注意并非XML文档中出现几个命名空间,就对应几个命名空间结点,而是有数量多得多的命名空间结点。命名空间结点依附于元素结点,一个元素处于哪些命名空间的作用域内,这个元素结点就拥有哪些命名空间结点,一个命名空间对应一个结点。

XSLT不处理命名空间结点,因此XSLT所处理的结点只有6种,其中最重要的是文档根结点、元素结点、文本结点和属性结点。
•选择价格大于30的书籍,并列出标题和价格 :
<xsl:for-each select="/books/book">
  <xsl:if test="price > 30">
   <tr>
    <td><xsl:value-of select="title" />:
    price=<xsl:value-of select="price"/>
    </td>
   </tr>
   </xsl:if>
</xsl:for-each> 

6.多分支选择:

•<xsl:choose>的作用类似于C语言的switch或PASCAL的case,其格式为: 
<xsl:choose>
  <xsl:when test=boolen-expression-1>
    …  <!-- 处理满足boolen-expression-1的数据 -->
  </xsl:when>
  <xsl:when test=boolen-expression-2>
    …  <!-- 处理满足boolen-expression-2的数据 -->
  </xsl:when>
    …  <!-- 其它xsl:when -->
  <xsl:otherwise>
    …  <!-- 处理其它情况 -->
  </xsl:otherwise>
</xsl:choose> 

多分支选择示例:
<xsl:choose>
    <xsl:when test="publisher='清华大学出版社'">
       <td bgcolor="yellow">
       <xsl:value-of select="title" />,
         <xsl:value-of select="publisher" /></td>
    </xsl:when> 
    <xsl:when test="publisher='电子工业出版社'">
        <td bgcolor="lime">
        <xsl:value-of select="title" />, 
          <xsl:value-of select="publisher" /></td>
    </xsl:when> 
    <xsl:otherwise>
        <td bgcolor="white">
        <xsl:value-of select="title" />, 
          <xsl:value-of select="publisher" /></td>
    </xsl:otherwise> 
  </xsl:choose> 

7.模板的应用:xsl:apply-templates

• 复杂的转换需要使用多个模板,每一个模板负责处理一部分结构。

• 模板的作用类似于程序设计语言中的子程序,而应用模板类似于调用子程序。

• 定义模板的语法前已述及。

• 应用模板的语法:

<xsl:apply-templates

select=”node-set-expression”>

<!-- <xsl:sort> 或<xsl:with-param> -->

</xsl:apply-templates>

• 其中的node-set-expression是一个XPath表达式,指出需要应用模板的结点集。如果某个模板的match属性patternnode-set-expression匹配,则应用这个模板处理这个结点集。

应用模板:

• 如果应用模板时不使用xsl:sort或 xsl:with-param,则可以简化为:

<xsl:apply-templates

select=”node-set-expr”/>

• 如果对当前结点的所有子结点应用模板 :

<xsl:apply-templates/>

注意这条指令不是对当前结点应用模板,而是对当前结点的所有子结点,而在所有结点中,只有文档根结点和元素结点才有子结点,并且属性结点并非它们的子结点。

模板应用示例(1):

匹配<book>的模板:

<xsl:template match="book">
  <p>标题: <xsl:value-of select="title" />,类别:<xsl:value-of select="@category" /></p>
  <p>作者:<xsl:apply-templates select="authors"/>, 
        ISBN:<xsl:value-of select="ISBN" /></p>
  <p>出版社:<xsl:value-of select="publisher" />, 
       出版日期:<xsl:value-of select="date" /></p>
  <hr size="3"/>
</xsl:template> 
模板应用示例(2):
匹配<authors>的模板:
<xsl:template match="authors">
   <xsl:for-each select="author">
      <xsl:value-of select="." >
      <![CDATA[  ]]>  
   </xsl:for-each>
</xsl:template>

CDATA标记包含的文字将被作为文本复制到目的文档中,此处CDATA所包含的文字是一个空格。

模板应用示例(3)

调用上述两个模板:

<xsl:template match="/">
  <html>
    <body>
       <xsl:apply-templates />
   </body>
  </html> 
</xsl:template>

8.默认模板

用户编写的全体模板并不需要覆盖源文档树中的每一个结点。

• XSLT处理器有一些内置的默认模板,对于用户编写的模板没有包含的结点,XSLT处理器将应用默认的模板来处理这些结点。

• XSLT文档中用户编写的模板优先于默认模板。

默认模板有3个 :

1.  <xsl:template match="*|/" >
           <xsl:apply-templates />
     </xsl:template> 
2.  <xsl:template match="text()|@*" >
          <xsl:value-of select="." />
     </xsl:template> 
<xsl:template match="processing-instruction()|comment()" /> 

对于如下XML文档和XSLT文档,转换的结果是什么?



9、对源文档结点的处理次序

• XSLT处理器对源文档树中的结点进行处理时,结点的处理次序由XSLT文档中用户编写的模板和处理器默认的模板共同决定。

• 首先,XSLT处理器对文档根结点调用匹配的模板,如果没有匹配的用户模板,则调用默认模板,其结果是对文档根结点的每个子结点调用模板,至于这些子结点的先后次序,则按照它们在文档中出现的先后次序。

• 对于每个子结点,重复以上过程。一旦一个结点与某个用户模板匹配,则该结点及其为根的子树就交由用户模板处理,用户模板中的指令决定这棵子树中各个结点的处理次序。如果没有任何用户模板与之匹配,则调用匹配的默认模板。

属性结点不是任何结点的子结点,因此尽管有一个匹配属性结点的默认模板,但反复执行<xsl:apply-templates />并不能调用这个模板。要处理属性结点,必须在用户模板中有相应的指令,例如,

<xsl:apply-templates select="@*" />

<xsl:value-of selelct="@*" />

猜你在找的XML相关文章