本節將舉例學習如何用XSL將XML轉換成HTML。這個舉例的細節將在下一節中解釋。

XSLT命令[xml格式轉換]
1.循環 <xsl:for-each...>
<xsl:for-each select="BookList/Item">
<tr>
<th align="left"> <xsl:value-of select=".//title" /></th>
<td><xsl:value-of select=".//categroy" /></td>
<td><xsl:value-of select=".//release-date" /></td>
<td><xsl:value-of select=".//author" /></td>
<td><xsl:value-of select="@price" /></td>
</tr>
</xsl:for-each>
2.排序 <xsl:sort...>
3.條件處理 <xsl:if...>或<xsl:choose...>或<xsl:when...>
4.名稱模板
<xsl:template name...<xsl:template name...>,<xsl:param...>
<xsl:with-param...>,<xsl:call-template...>
5.編號方式 <xsl:number value format...>


關于語法的具體學習,看http://www.w3schools.com/xsl/default.asp

6、XSL樣式單
  一個XSL文件也是XML文件,所以第一行也要聲明XML:

<?xml version="1.0" encoding="ISO-8859-1"?>


  第二行XSL聲明,下述聲明方式是完全一致的:

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



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

 


  當用上述命名空間時,必須有version="1.0"的說明。
  看子:XML文件,XSL文件,XML+XSL.

7、<xsl:template>元素
  XSL樣式單是由模板組成,每個模板就是一組規則
  模板的match屬性,用以將模板和XML中的元素關聯起來。如match="/"則將此模板與XML的根關聯起來了。

8、<xsl:value-of>元素
該元素用于取得選定XML節點的值。
  對節點的選取,由其select屬性完成,select的值是一個XPath表達式。XPath表達式非常象*nix系統的多級目錄的寫法。如例中的“breakfast_menu/food”等。

9、<xsl:for-each>元素
  完成在XSL中的循環動作。其屬性select同6中所述。
  此元素可以完成簡單的過濾,例如:
 

<xsl:for-each select="catalog/cd[artist='Bob Dylan']">

可用于尋找Bob Dylan的CD作品。XSL定義了四種比較運算符:!=&lt&gt,兩個比較之間可以用and 或or 連接。


10、<xsl:sort>元素
  用于對輸出進行排序,只需要將其放入<xsl:for-each>以內,并用select指明比較的元素即可。

11、<xsl:if>元素
  當指定條件滿足時,<xsl:if>包含的模板將派上用場。條件的定義,由其test屬性指明,其操作符同7。
  一般說來,<xsl:if>常出現在<xsl:for-each>內部。


12、<xsl:choose>、<xsl:when>、<xsl:otherwise>元素
  三者聯合,實現多條件選擇,類似C語言里的case語句。如例:

<xsl:choose>
   
<xsl:when test="price &gt; 10">
       some code 
   
</xsl:when>
   
<xsl:otherwise>
       some code .
   
</xsl:otherwise>
</xsl:choose>

11、<xsl:apply-templates>元素
  對當前元素和其子元素使用某一模板規則,象C里的遞規函數,暗含著循環的功能。其用select屬性指明元素。相對應的模板,則需要用match來判斷傳來的是什么元素,從這一點看模板象是C++里的重載函數。

1、<xsl:import>、<xsl:include>、<xsl:apply-imports>元素
  <xsl:import>與<xsl:include>相比,兩者都須是<xsl:stylesheet>的子結點,但前者定義的模板規則優先級比較低,且必須為第一個子結點。兩者的功能是相同的,都是將另一個定義好的XSL文件裝入到當前XSL文件中來。
  裝來的模板規則,由<xsl:apply-imports>指定何時何地使用。
  它們的語法分別是:

<xsl:import href="URI"/>
<xsl:apply-templates />

 

  2、<xsl:attribute>、<xsl:attribute-set>元素
  前者用以給元素增加屬性,已有同名屬性則被它替換。后者是<xsl:stylesheet>的子結點,用來定義一組屬性,將其用于整個文檔。語法如下:

<xsl:attribute name="attributename" namespace="uri"><!-- Content:template --></xsl:attribute>
<xsl:attribute-set name="name" use-attribute-sets="name-list"><!-- Content:xsl:attribute* --></xsl:attribute-set>


  namespace可選,use-attribute-sets可選,用以使用其它預定義的attribute-set.

 

  3、<xsl:param>、<xsl:call-template>、<xsl:with-param>元素
  <xsl:param>用來定義全局參數(是<xsl:styelsheet>的子點時)或局域參數(在一個模板內時),<xsl:call-template>用來調用指定的模板,<xsl:with-param>則用來調用模板或使用模板時傳遞參數。需要說明的是,with-param的name屬性的值必須與預定義的值一致。語法如下:

<xsl:param name="name" select="expression"><!-- Content:template --></xsl:param>
<xsl:call-template name="templatename"><!-- Content:xsl:with-param* --></xsl:call-template>
<xsl:with-param name="name" select="expression"><!-- Content:template --></xsl:with-param>


  其中的select都是可選的,前者的select用來指定默認值,后者可以來傳值(也可用標簽的內容傳值)。

 

  4、<xsl:variable>元素
  定義全局或局部變量,其一旦賦值,不能改動。語法:

<xsl:variable name="name" select="expression"><!-- Content:template --></xsl:variable>

 

  5、<xsl:copy>、<xsl:copy-of>元素
  兩者都復制當前節點及其命名空間,但后者還復制子結點和當前結點屬性。語法如下:

<xsl:copy-of select="expression"/>
<xsl:copy use-attribute-sets="name-list"><!-- Content:template --></xsl:copy>

其中use-attribute-sets可選。

 

  6、<xsl:comment>元素
  在結果樹中生成一個注釋結點。語法如下:

<xsl:comment><!-- Content:template --></xsl:comment>

 

  7、<xsl:decimal-format>元素
  定義那些在調用函數format-number()進行由數字向字符器轉換的過程中用到的一些特殊字符或符號。語法如下:

<xsl:decimal-format name="name" decimal-separator="char" grouping-separator="char" infinity="string"
minus-sign="char" NaN="string" percent="char" per-mille="char" zero-digit="char" digit="char" pattern-separator="char"/>

所有項是可選的。

 

  8、<xsl:element>元素
  在結果樹上生成一個元素,語法如下:

<xsl:element name="name" namespace="URI" use-attribute-sets="namelist"><!-- Content:template --></xsl:element>

其中后兩個屬性是可選的,前倆者的值可在實時運行時算出。

 

  9、<xsl:fallback>元素
  當xsl的元素不能被處理器識別時,調用fallback提供的備用程序。

<xsl:fallback><!-- Content: template --></xsl:fallback>

 

  10、<xsl:key>元素
  這是一個頂層元素,定義一個KEY供Key函數使用。

<xsl:key name="name" match="pattern" use="expression"/>

 

  11、<xsl:message>元素
  用來輸出信息,如錯誤信息。所有的其它元素都可出現在其內容中。

<xsl:message terminate="yes|no"> <!-- Content:template --></xsl:message>

 

  12、<xsl:namespace-alias>元素
  用來在輸出時將某命名空間替換為另一個。

<xsl:namespace-alias stylesheet-prefix="prefix|#default" result-prefix="prefix|"#default"/>

 

  13、<xsl:number>元素
  用以標明當前結點在源樹中的順序,也可以用格式化一個數。

<xsl:number count="expression" level="single|multiple|any" from="expression" value="expression" format="formatstring"
lang="languagecode" letter-value="alphabetic|traditional" grouping-separator="character" grouping-size="number"/>

 

  14、<xsl:output>元素
  用以定義output的格式,

<xsl:output method="xml|html|text|name" version="string" encoding="string" omit-xml-declaration="yes|no"
standalone="yes|no" doctype-public="string" doctype-system="string" cdata-section-elements="namelist"
indent="yes|no" media-type="string"/>

 

  15、<xsl:preserve-space>、<xsl:strip-space>元素
  兩者用來指明元素內容的空格保留還去掉。由于默認是保留的,所以只有在用了去掉時才需指明保留者。

<xsl:preserve-space elements="list-of-element-names"/>
<xsl:strip-space elements="list-of-element-names"/>


  list-of-element-names的值中可用*通配符。

 

  16、<xsl:processing-instruction>元素
  用來向輸出寫處理指令,如指定css文件等。

<xsl:processing-instruction name="process-name"><!-- Content:template --></xsl:processing-instruction>

 

  17、<xsl:text>元素
  用來輸出字串常量。

<xsl:text disable-output-escaping="yes|no"> <!-- Content:#PCDATA --></xsl:text>



從XML文檔開始
  首先從打算轉換成HTML的XML文檔開始:

 

<?xml version="1.0"?>
              
<CATALOG>
               
<CD>
                
<TITLE>Empire Burlesque</TITLE>
                
<ARTIST>Bob Dylan</ARTIST>
                
<COUNTRY>USA</COUNTRY>
                
<COMPANY>Columbia</COMPANY>
                
<PRICE>10.90</PRICE>
                
<YEAR>1985</YEAR>
               
</CD>

 
如果使用的是Internet Explorer 5.0或更高版本,就可以查看這個XML文件的 顯示結果
創建一個XSL樣式表文檔
  現在用轉換模板來創建一個XSL樣式表:



//一個XSL文件也是XML文件,所以第一行也要聲明XML:

<?xml version='1.0'?>

                       <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
              
<xsl:template match="/">
               
<html>
               
<body>
                
<table border="2" bgcolor="yellow">
                 
<tr>
                  
<th>Title</th>
                  
<th>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>
            


 

如果使用的是Internet Explorer 5.0或更高版本,就可以查看這個XSL文件的 顯示結果
將樣式表連接到XML文檔
  現在向XML文檔中增加一個XSL樣式表引用:

 

<?xml version="1.0"?>
              
<?xml-stylesheet type="text/xsl" href="cd_catalog.xsl"?>
              
<CATALOG>
               
<CD>
                
<TITLE>Empire Burlesque</TITLE>
                
<ARTIST>Bob Dylan</ARTIST>
                
<COUNTRY>USA</COUNTRY>
                
<COMPANY>Columbia</COMPANY>
                
<PRICE>10.90</PRICE>
                
<YEAR>1985</YEAR>
               
</CD>


如果有一個與XSL兼容的瀏覽器,例如Internet Explorer 5.0或更高版本,那么就能很好地將XML轉換成HTML。點擊這里 查看結果

XSL如何使用模板來定義從XML到另一種輸出格式的轉換

XSL模板

  XSL用模板來描述如何輸出 XML。

CSS的使用規則
  如果已經學習過CSS的知識,我們就會知道CSS是用一個或多個規則來定義HTML元素的輸出,用一個選擇器將規則與一個HTML元素聯系起來。比如以下這個CSS規則中的p選擇器說明應該用一種叫做arial的字體來顯示一個<p>元素:
  p { font-family: arial }

XSL使用模板
  XSL使用一個或多個模板來定義如何輸出XML元素,用一個匹配屬性來將模板與一個XML元素聯系起來,還可以用匹配屬性來為XML文檔的一個完整分支來定義模板。
請看以下的XSL樣式表,它包含一個模板以輸出前一節中的XML CD目錄:
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr>
<th>Title</th>
<th>Artist</th>
</tr>
<tr>
<td>.</td>
<td>.</td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

由于樣式表本身就是一個XML文檔,因此文檔以一個xml聲明開始:<?xml


客戶端XSL:如何用XML解析器在客戶機上將XML文檔轉換成HTML文檔。

一個JavaScript的解決方法
在前文中,我們解釋了如何用XSL將一個文檔從XML轉換成HTML。竅門就是向XML文件中增加一個XSL樣式表,然后讓瀏覽器來進行轉換。即使這種方法能奏效,在XML文件中包含一個樣式表引用也并非令人滿意的方法,并且在不支持XSL的瀏覽器上這種方法還不能奏效。
一個更通用的方法應該是用一個JavaScript來進行從XML到HTML的轉換。使用一個JavaScript,就更有以下可能性:

  • 允許JavaScript進行瀏覽器細節測試;
  • 根據瀏覽器和用戶需求使用不同的樣式表。
  • 這就是XSL的美妙之處。XSL設計目的之一就是使數據從一個格式轉換成另一個格式成為可能,從而支持不同的瀏覽器和不同的用戶需求。
  • 客戶端XSL轉換將成為未來瀏覽器工作任務的一個主要部分,我們還將看到專業化瀏覽器市場的成長,比如Braille、發聲網絡、網絡打印機、手持PC、移動電話等。


XML文件和XSL文件
現在重新來看看前面章節中的XML文檔:

<?xml version="1.0"?>
    
<CATALOG>
      
<CD>
        
<TITLE>Empire Burlesque</TITLE>
        
<ARTIST>Bob Dylan</ARTIST>
        
<COUNTRY>USA</COUNTRY>
        
<COMPANY>Columbia</COMPANY>
        
<PRICE>10.90</PRICE>
        
<YEAR>1985</YEAR>
      
</CD>
    .
    .
    .
    還有附帶的XSL樣式表:
    
<?xml version='1.0'?>
    
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
    
<xsl:template match="/">
      
<html>
      
<body>
        
<table border="2" bgcolor="yellow">
          
<tr>
            
<th>Title</th>
            
<th>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>


要確保XML文件沒有對XSL文件的引用,XSL文件也沒有對XML文件的引用。注意:上面的句子說明一個XML文件可以用許多不同的XSL文件進行轉換。
在瀏覽器中將XML轉換到HTML
以下是在客戶機上將XML文件轉換成HTML所需要的源代碼,很簡單:

<html>
    
<body>
    
<script language="javascript">
    
// Load XML
    var xml = new ActiveXObject("Microsoft.XMLDOM")
    xml.async 
= false
    xml.load(
"cd_catalog.xml")
    
// Load the XSL
    var xsl = new ActiveXObject("Microsoft.XMLDOM")
    xsl.async 
= false
    xsl.load(
"cd_catalog.xsl")
    
// Transform
    document.write(xml.transformNode(xsl))
    
</script>
    
</body>
    
</html>



如果使用的是Internet Explorer 5.0 或更高版本,請點擊這里 查看結果

代碼的第一塊創建了Microsoft XML 解析器(XMLDOM)的一個例示,并將XML文檔加載到內存中。代碼的第二塊創建解析器的另一個例示,并將XSL文檔加載到內存中。代碼的最后一行用XSL文檔轉換XML文檔,將結果寫入HTML 文檔中。

服務器端XSL:如何用XML解析器在服務器上將XML文檔轉換成HTML文檔。

服務器端XSL
由于不是所有的瀏覽器都支持XML和XSL,因此就有了一個在服務器上將XML轉換成HTML的方法。

一個跨瀏覽器的解決方法
在前面的章節中,我們解釋了如何用XSL在瀏覽器中將XML文檔轉換成HTML,竅門就是讓JavaScript使用一個XML解析器來進行轉換。但是當瀏覽器不支持XML解析器時,這種方法是不奏效的。要使XML數據對所有瀏覽器都可用,我們就必須在服務器上轉換XML文檔,并將它作為純HTML發送到瀏覽器。

這是XSL的另一個美妙之處。XSL的設計目的之一是使得在服務器上將數據從一種格式轉換成另一種格式成為可能,并將可讀數據返回到所有未來的瀏覽器中。

在服務器上進行XSL轉換正在成為未來Internet信息服務器工作任務的一個主要部分,同時我們將看到專用瀏覽器市場的發展,如:Braille、有聲網絡、網絡打印機、手持PC、移動電話等。

XML文件和XSL文件
現在來重新看看前面章節中的XML文檔:

 

    <?xml version="1.0"?>
    
<CATALOG>
      
<CD>
        
<TITLE>Empire Burlesque</TITLE>
        
<ARTIST>Bob Dylan</ARTIST>
        
<COUNTRY>USA</COUNTRY>
        
<COMPANY>Columbia</COMPANY>
        
<PRICE>10.90</PRICE>
        
<YEAR>1985</YEAR>
      
</CD>
    .
    .
    .

 


如果使用的是Internet Explorer 5.0或更高版本,可以點擊這里查看 XML文件
再看看伴隨的XSL樣式表:

<?xml version='1.0'?>
    
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
    
<xsl:template match="/">
      
<html>
      
<body>
        
<table border="2" bgcolor="yellow">
          
<tr>
            
<th>Title</th>
            
<th>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>


如果使用的是Internet Explorer 5.0或更高版本,可以點擊這里查看 XSL文件

以上XSL文檔的語法在前面章節中已經解釋過了,因此這里不再做解釋。但是要確保XML文件沒有對XSL文件的引用,XSL文件也沒有對XML文件的引用。同時請注意:上面的句子表明一個服務器上的XML文件可以用許多不同的XSL文件進行轉換。

在服務器端將XML轉換成HTML
以下是在服務器上轉換XML文件所需要的簡單源代碼:

<%
    
'Load the XML
    set xml = Server.CreateObject("Microsoft.XMLDOM")
    xml.async 
= false
    xml.load(Server.MapPath(
"cd_catalog.xml"))
    
'Load the XSL
    set xsl = Server.CreateObject("Microsoft.XMLDOM")
    xsl.async 
= false
    xsl.load(Server.MapPath(
"cd_catalog.xsl"))
    
'Transform the file
    Response.Write(xml.transformNode(xsl))
    
%>


代碼的第一塊創建Microsoft XML解析器(XMLDOM)的一個例示,并將XML文件裝載到內存中。代碼的第二塊創建解析器的另一個例示,并將XSL文檔裝載到內存。代碼的最后一行用XSL文檔轉換XML文檔,并將結果返回瀏覽器。

XSL索引:將XML文檔轉換成HTML之前,如何用XML解析器來對XML文檔進行索引。

XSL索引
XSL可以用來對一個XML文檔進行索引。

將索引信息放在哪里
現在重新看看在以前許多章節中都曾看到過的 XML文檔:

 

<?xml version="1.0"?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
.
.
.


要想將這個XML文件作為一個普通的HTML文件輸出,并且同時對它進行索引,只需要在XSL文件中增加一個order-by 屬性,如下:
<xsl:for-each select="CATALOG/CD" order-by="+ ARTIST">

order-by屬性使用加號(+)或減號(-)來定義是使用升序還是降序,再用一個元素名稱來定義排序的元素。

現在來看看經過輕微調整的XSL樣式表(或在IE5中打開它):

 

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<table border="2" bgcolor="yellow">
<tr>
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="CATALOG/CD"
order-by
="+ ARTIST">
<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>


 

在瀏覽器中轉換
以下是在瀏覽器中將XML文件轉換成HTML所需要的簡單代碼:
 

<html>
<body>
<script language="javascript">
// Load XML
var xml = new ActiveXObject("Microsoft.XMLDOM")
xml.async 
= false
xml.load(
"cd_catalog.xml")
// Load the XSL
var xsl = new ActiveXObject("Microsoft.XMLDOM")
xsl.async 
= false
xsl.load(
"cd_catalog_sort.xsl")
// Transform
document.write(xml.transformNode(xsl))
</script>
</body>
</html>


如果使用的是Internet Explorer 5.0 或更高版本,請點擊這里 查看結果

XSL過濾器:將XML文檔轉換成HTML之前,如何用XML解析器過濾XML文檔。

XSL過濾器查詢
XSL可以用來過濾一個 XML 文件。

在哪里放置過濾器信息
現在重新看看你以前已經看過多次的XML文檔:

 

<?xml version="1.0"?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
.

 

要過濾XML文件,只需要為XSL文件中的for-each元素的選擇屬性增加一個過濾器,如下:
<xsl:for-each select="CATALOG/CD[ARTIST='Bob Dylan']">

合法的過濾器操作符是:

 

= 等于
!= 不等于
< 小于
> 大于

 

現在看看經過輕微調整的XSL樣式表:

 

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<table border="2" bgcolor="yellow">
<tr>
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="CATALOG/CD[ARTIST='Bob Dylan']">
<tr>
<td><xsl:value-of select="TITLE"/></td>
<td><xsl:value-of select="ARTIST"/></td>
</tr>
</xsl:for-each>
</ta