XML & XSLT Details

318 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1. 你真的懂xml吗?

1.1 XML 概述

说实话,之前呢对XMl的理解很浅显,就是知道它是一种数据格式,然后具体的规范这些不是很懂。今天呢再加深一点对它的理解。

XML:可扩展的标记语言。Extensible Markup Language. 这玩意造出来是为了传输和存储数据的。有的人可能会混淆XML和HTML,这两个是完全不同的两个东西,HTML是用来显示数据,焦点是数据的外观,和XML是用来传输和存储数据,焦点是数据内容。

1.2 XML组成部分介绍

XML是树结构,组成部分包括元素,属性。树结构很好理解了,就是XML必须包含根节点。元素呢,怎么理解,元素就是会包含其他元素或文本的东西。只有元素才拥有属性。牛逼!文本是没有属性的啊。

<bookstore>
<book category="CHILDREN">
  <title>Harry Potter</title> 
  <author>J K. Rowling</author> 
  <year>2005</year> 
  <price>29.99</price> 
</book>
<book category="WEB">
  <title>Learning XML</title> 
  <author>Erik T. Ray</author> 
  <year>2003</year> 
  <price>39.95</price> 
</book>
</bookstore> 

看看这货,bookstore 是根节点,它也是元素,它包含了很多的其他元素和文本。然后呢,book也是元素,它有属性,属性是category,我为啥要这么详细的说这个呢,因为我对属性的概念真的不懂啊,不知道为啥要搞出这个,可能是为了解析的时候用吧,相当于解析到这个元素时,先解析下这个属性。

1.3 XML规范

  • 首先很简单的,肯定是有一对标签,关闭标签不能少
  • 大小写敏感,区分大小写。标签不能用数字或者标点符号开始,也不能有空格
  • 属性内容必须有双引号
  • 不要用这种,first-book,用这种first_book

1.4 XML的namespace

当当当,XML也有namespace啊,当然了,你想想看,我一个html包含XML时,要用相同的一个标签,怎么区分,只能靠namespace了。也可以用前缀的方式了,

<table xmlns="http://www.w3.org/TR/html4/">
  <tr>
  <td>Apples</td>
  <td>Bananas</td>
  </tr>
</table>
<table xmlns="http://www.w3school.com.cn/furniture">
  <name>African Coffee Table</name>
  <width>80</width>
  <length>120</length>
</table>

1.5 其他

其他的没啥意思了,比如DOM,就是Document Object Model,就是用来解析这些XML树状结构的,把XML进行解析。还有XML的编码,Unicode 或gb, 这个是XML的头。记记就好。

2. XSL

好了,我懂了XML, 现在呢,就学下XSL。

XSL 是扩展样式表语言,Extensible Stylesheet Language. 通过XSL可以对XML进行转换和扩展,扩展成需要的格式。XSL包含XSLT,XPath和XSL-FO。XSL的难点就是要理解它的语法结构,然后再使用它。

2.1 XSL 的一些用法

  • 样式表的声明

    根元素是xsl:stylesheetxsl:transform

  • XSLT template 的使用

    这个是用来构建模板。什么意思呢,就是先用match 功能match 到原始的xml中的节点,然后把这部分节点改写成template 形式。

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <catalog>
     <cd>
       <title>Empire Burlesque</title>
       <artist>Bob Dylan</artist>
       <country>USA</country>
       <company>Columbia</company>
       <price>10.90</price>
       <year>1985</year>
     </cd>
    </catalog>
    

    这个是转换前的xml,现在需要转换。

    <?xml version="1.0" encoding="ISO-8859-1"?>
    
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="/">
     <html>
     <body>
       <h2>My CD Collection</h2>
       <table border="1">
       <tr bgcolor="#9acd32">
         <th align="left">Title</th>
         <th align="left">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>
    
    

    看这个,通过这个xsl的template 来进行转换了。它是match的根节点,然 后把match到的根节点根据template 模版进行显示。

  • xsl value-of 元素

    怎么对标签里的东西进行取值呢,这个就用到了xsl:value-of, 咋用呢,看这个例子就知道了。

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="/">
    <html>
    <body>
      <h2>My CD Collection</h2>
      <table border="1">
        <tr bgcolor="#9acd32">
          <th>Title</th>
          <th>Artist</th>
        </tr>
        <tr>
         <td><xsl:value-of select="catalog/cd/title"/></td>
         <td><xsl:value-of select="catalog/cd/artist"/></td>
        </tr>
      </table>
    </body>
    </html>
    </xsl:template>
    
    </xsl:stylesheet>
    

    相当于,用select 函数来对xml里的数据进行取值,然后把转换的结果送到 输出流中。

  • xml apply

    说实话,这个真的有点绕,但是慢慢的又有点想明白了,发明这玩意,貌似是解决这种情况,就是xml中有循环嵌套的,用apply这个把每个循环体都搞出来。可以看看例子。

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="/">
    <html>
    <body>
    <h2>My CD Collection</h2> 
    <xsl:apply-templates/> 
    </body>
    </html>
    </xsl:template>
    
    <xsl:template match="cd">
    <p>
    <xsl:apply-templates select="title"/> 
    <xsl:apply-templates select="artist"/>
    </p>
    </xsl:template>
    
    <xsl:template match="title">
    Title: <span style="color:#ff0000">
    <xsl:value-of select="."/></span>
    <br />
    </xsl:template>
    
    <xsl:template match="artist">
    Artist: <span style="color:#00ff00">
    <xsl:value-of select="."/></span>
    <br />
    </xsl:template>
    
    </xsl:stylesheet>
    

    ​ 看看这个,就是用的apply来进行把所有的子节点取出来。说真的,我还是有点没太理解。

  • xsl call-templates

    这个其实很好理解,就是相当于一个函数模块的调用。