首頁  >  文章  >  後端開發  >  瘋狂XML學習筆記(11)-----------XSLT講解

瘋狂XML學習筆記(11)-----------XSLT講解

黄舟
黄舟原創
2017-02-21 14:44:501390瀏覽


前面對XML的基本的知識已經整理過了,如果有興趣可以存取下面的網址

http://www.php.cn/

 

對於文章中的圖文顯示部分出現錯誤,無法顯示,敬請諒解!

想查看的話可以下載w3cshool API 文件

#連接http://www.php.cn/下載

 

XSLT它起始於XSL,結束於XSLT、XPath 以及XSL-FO。

後面會對XPath進行詳細解說

起始於XSL

XSL 指擴充樣式表語言(EXtensible Stylesheet Language)。

萬維網聯盟 (W3C) 開始發展 XSL 的原因是:存在著基於 XML 的樣式表語言的需求。

CSS = HTML 樣式表

#HTML 使用預先定義的標籤,標籤的意義很容易被理解

HTML 元素中的 f5d188ed2c074f8b944552db028f98a1 元素定義表格 - 並且瀏覽器清楚如何顯示它

為 HTML 元素新增樣式是很容易的。透過 CSS,很容易告知瀏覽器用特定的字體或顏色顯示一個元素。

XSL = XML 樣式表

XML 不使用預先定義的標籤(我們可以使用任何喜歡的標籤名稱),而這些標籤的意義並不都那麼容易被理解

f5d188ed2c074f8b944552db028f98a1 元素意味著一個 HTML 表格,一件家具,或別的東西 - 瀏覽器不清楚如何顯示它

XSL 可描述如何顯示 XML 文件!

XSL - 不只是樣式表語言

XSL 包含三個部分:

  • XSLT

  • ##一種用於轉換XML 文件的語言。

  • XPath

  • 一種用於在 XML 文件中導覽的語言。

  • XSL-FO

  • 一種用於格式化 XML 文件的語言。

 


#XSLT 是一種用於將XML 文檔轉換為XHTML 文件或其他XML 文檔的語言。

XPath 是一種用於在 XML 文件中進行導覽的語言。

學習之前,您需要具備的基礎知識:

在您繼續學習之前,需要對以下知識有基本的了解:

  • HTML / XHTML

  • XML / XML 命名空間

  • ##XPath
  • 如果您希望先學習這些項目,請在我們的 首頁 造訪這些教學。

什麼是 XSLT?

    XSLT 指 XSL 轉換(XSL Transformations)。
  • XSLT 是 XSL 中最重要的部分。
  • XSLT 可將一種 XML 文檔轉換為另外一種 XML 文件。
  • XSLT 使用 XPath 在 XML 文件中進行導覽。
  • XPath 是一個 W3C 標準。

XSLT = XSL 轉換

XSLT 是 XSL 中最重要的部分。

XSLT 用於將一種 XML 文檔轉換為另一種 XML 文檔,或可被瀏覽器識別的其他類型的文檔,例如 HTML 和 XHTML。通常,XSLT 是透過把每個 XML 元素轉換為 (X)HTML 元素來完成這項工作的。

透過 XSLT,您可以向或從輸出檔案新增或移除元素和屬性。您也可以重新排列元素,執行測試並決定要隱藏或顯示哪個元素,等等。

描述轉換過程的一個通常的說法是,

XSLT 把 XML 來源樹轉換為 XML 結果樹

XSLT 使用 XPath

XSLT 使用 XPath 在 XML 文件中尋找資訊。 XPath 被用來透過元素和屬性在 XML 文件中進行導覽。

如果您希望先學習 XPath,請造訪我們的 XPath 教學。

它如何運作?

在轉換過程中,XSLT 使用 XPath 來定義來源文件中可符合一個或多個預定義範本的部分。一旦符合被找到,XSLT 就會把來源文件的符合部分轉換為結果文件。

 

正確的樣式表宣告

#把文件宣告為XSL 樣式表的根元素是0b5bf39ece7b5f7e6b1ecb70d0153db3 或531584125f9072736f72fc92cb1ce734。

註解: 8bfba33610b8df90976a82ef1f8b7575 和 531584125f9072736f72fc92cb1ce734 是完全同義的,都可以使用!

根據W3C 的XSLT 標準,宣告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">

 

如需存取XSLT 的元素、屬性以及特性,我們必須在文件頂端宣告XSLT 命名空間。

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 指向了官方的 W3C XSLT 命名空间。如果您使用此命名空间,就必须包含属性 version="1.0"。

从一个原始的 XML 文档开始

我们现在要把下面这个 XML 文档("cdcatalog.xml")转换为 XHTML:

<?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>

在 Internet Explorer 和 Firefox 中查看 XML 文件:

打开 XML 文件(通常通过点击某个链接) - XML 文档会以颜色化的代码方式来显示根元素及子元素。点击元素左侧的加号或减号可展开或收缩元素的结构。如需查看原始的XML源文件(不带有加号和减号),请在浏览器菜单中选择“查看页面源代码”。

在 Netscape 6 中查看 XML 文件:

打开 XML 文件,然后在 XML 文件中右击,并选择“查看页面源代码”。XML文档会以颜色化的代码方式来显示根元素及子元素。

在 Opera 7 中查看 XML 文件:

打开 XML 文件,然后在XML文件中右击,选择“框架”/“查看源代码”。XML文档将显示为纯文本。

 

创建 XSL 样式表

然后创建一个带有转换模板的 XSL 样式表("cdcatalog.xsl"):

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

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


  
  
    

My CD Collection

Title Artist

 

把 XSL 样式表链接到 XML 文档

向 XML 文档("cdcatalog.xml")添加 XSL 样式表引用:

<?xml version="1.0" encoding="ISO-8859-1"?><?xml-stylesheet type="text/xsl" href="cdcatalog.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>
.
.
.
</catalog>

 

 

2032d1f3e843089f381a035edc734156 元素

2032d1f3e843089f381a035edc734156 元素用于构建模板。

match 属性用于关联 XML 元素和模板。match 属性也可用来为整个文档定义模板。match 属性的值是 XPath 表达式(举例,match="/" 定义整个文档)。

好了,让我们看一下上一节中的 XSL 文件的简化版本:

<?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>.</td>
       <td>.</td>
     </tr>
   </table>
 </body>
 </html>
</xsl:template>

</xsl:stylesheet>

代码解释:

由于 XSL 样式表本身也是一个 XML 文档,因此它总是由 XML 声明起始:

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

下一个元素,8bfba33610b8df90976a82ef1f8b7575,定义此文档是一个 XSLT 样式表文档(连同版本号和 XSLT 命名空间属性)。

2032d1f3e843089f381a035edc734156 元素定义了一个模板。而 match="/" 属性则把此模板与 XML 源文档的根相联系。

2032d1f3e843089f381a035edc734156 元素内部的内容定义了写到输出结果的 HTML 代码。

最后两行定义了模板的结尾,及样式表的结尾。

以上转换的结果类似这样:

 

 

02b2fbed6ee2fe75988418f1eace8181 元素

02b2fbed6ee2fe75988418f1eace8181 元素用于提取某个选定节点的值,并把值添加到转换的输出流中:

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



 
 
   

My CD Collection

Title Artist

注释:select 属性的值是一个 XPath 表达式。此表达式的工作方式类似于定位某个文件系统,在其中正斜杠可选择子目录。

上面的转换结果类似这样:

 

 

 


431e46b64b4819f2ac967516fbb4b43f 元素

431e46b64b4819f2ac967516fbb4b43f 元素可用于选取指定的节点集中的每个 XML 元素。

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



  
  
    

My CD Collection

Title Artist

注释:select 属性的值是一个 XPath 表达式。此表达式的工作方式类似于定位某个文件系统,在其中正斜杠可选择子目录。

上面的转换结果类似这样:

 

结果过滤

通过在 431e46b64b4819f2ac967516fbb4b43f 元素中添加一个选择属性的判别式,我们也可以过滤从 XML 文件输出的结果。

<xsl:for-each select="catalog/cd[artist=&#39;Bob Dylan&#39;]">

合法的过滤运算符:

  • =  (等于)

  • != (不等于)

  • < (小于)

  • > (大于)

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



 
  
  

My CD Collection

<xsl:for-each select="catalog/cd[artist=&#39;Bob Dylan&#39;]">
Title Artist

上面的转换结果类似这样:

 


f3a7eb5c7af94a622c8698ad8c159369 元素用于对结果进行排序。

在何处放置排序信息

如需对结果进行排序,只要简单地在 XSL 文件中的 431e46b64b4819f2ac967516fbb4b43f 元素内部添加一个 f3a7eb5c7af94a622c8698ad8c159369 元素:

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



  
  
    

My CD Collection

Title Artist

注释:select 属性指示需要排序的 XML 元素。

上面的转换结果类似这样:

 

 

 

 


28d7e7bce771845b11cc99f4b371fb36 元素

如需放置针对 XML 文件内容的条件测试,请向 XSL 文档添加 28d7e7bce771845b11cc99f4b371fb36 元素。

语法

<xsl:if test="expression">
  ...
  ...如果条件成立则输出...
  ...
</xsl:if>

在何处放置 28d7e7bce771845b11cc99f4b371fb36 元素

如需添加有条件的测试,请在 XSL 文件中的 431e46b64b4819f2ac967516fbb4b43f 元素内部添加 28d7e7bce771845b11cc99f4b371fb36 元素:

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


  
  
    

My CD Collection

Title Artist

注释:必选的 test 属性的值包含了需要求值的表达式。

上面的代码仅仅会输出价格高于 10 的 CD 的 title 和 artist 元素。

上面的转换结果类似这样:

 

 

 

 

 


3e08d16b69ca6dceb52122b5e3e896ec 元素

语法

<xsl:choose>
  <xsl:when test="expression">
    ... 输出 ...
  </xsl:when>
  <xsl:otherwise>
    ... 输出 ....
  </xsl:otherwise>
</xsl:choose>

在何处放置选择条件

要插入针对 XML 文件的多重条件测试,请向 XSL 文件添加 3e08d16b69ca6dceb52122b5e3e896ec、1aab2a36c3da35537dba594d8b9f335a 以及 b490e3a477a758f8d417150b585fd42a:

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



  
  
    

My CD Collection

Title Artist

上面的代码会在 CD 的价格高于 10 时向 "Artist" 列添加粉色的背景颜色。

上面的转换结果类似这样:

查看此 XML 文件,查看此 XSL 文件,查看结果。

另一个例子

这是另外一个包含两个 1aab2a36c3da35537dba594d8b9f335a 元素的例子:

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



  
  
    

My CD Collection

Title Artist

上面的代码会在 CD 的价格高于 10 时向 "Artist" 列添加粉色的背景颜色,并在 CD 的价格高于 9 且低于等于 10 时向 "Artist" 列添加灰色的背景颜色。

上面的转换结果类似这样:

 

 

 


58ff327a04da27df4a7ce66c0ce40bdf 元素

58ff327a04da27df4a7ce66c0ce40bdf 元素可把一个模板应用于当前的元素或者当前元素的子节点。

假如我们向 58ff327a04da27df4a7ce66c0ce40bdf 元素添加一个 select 属性,此元素就会仅仅处理与属性值匹配的子元素。我们可以使用 select 属性来规定子节点被处理的顺序。

请看下面的 XSL 样式表:

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





My CD Collection

Title:
Artist:

 

XSLT 元素

如果您需要有关下列元素的更详细的信息,请点击元素列中的链接。

  • N: 表示最早支持此标签的 Netscape 版本

  • IE: 表示最早支持此标签的 Internet Explorer 版本

注释:在 IE 5 中所支持的元素可能出现非标准的行为,这是由于 IE 5 发布于 XSLT 被确立为正式的 W3C 标准之前。

元素 描述 IE #N
apply-imports 套用來自匯入樣式表中的模版規則。 6.0  
apply-templates #在目前元素或目前元素的子元素上套用範本。 5.0 6.0
attribute 為元素新增屬性。 5.0 6.0
attribute-set 建立命名的屬性集。 6.0 6.0
call-template #呼叫一個指定的模板。 6.0 6.0
choose 與bb41c5e2afa2e51b56cbbc78bba5590f以及08840e2c213e7be6cb36177580c1b0f8協同使用,來表達多重條件測試。 5.0 6.0
comment 在結果樹中建立註解節點。 5.0 6.0
copy 建立目前節點的備份(無子節點及屬性)。 5.0 6.0
copy-of 建立目前節點的備份(帶有子節點及屬性)。 6.0 6.0
#decimal-format 定義當透過format-number() 函數把數字轉換為字串時,所要使用的字元和符號。 6.0  
element 在輸出文件中建立一個元素節點。 5.0 6.0
fallback 假如處理器不支援某個XSLT元素,規定一段備用程式碼來運作。 6.0  
for-each 遍歷指定的節點集中的每個節點。 5.0 6.0
if 包含一個模板,僅當某個指定的條件成立時套用此模板。 5.0 6.0
import 用來把一個樣式表中的內容倒入另一個樣式表中。 6.0 6.0
include 把一個樣式表中的內容包含到另一個樣式表中。 6.0 6.0
key 聲明一個命名的鍵。 6.0 6.0
message 寫入訊息到輸出(用於錯誤報告)。 6.0 6.0
namespace-alias #將樣式表中的命名空間替換為輸出中不同的命名空間。 6.0  
number 測定目前節點的整數位置,並對數字進行格式化。 6.0 6.0
otherwise 規定 c88e008ca37f641f1d68866f53b5c0de 元素的預設動作。 5.0 6.0
output 定義輸出文件的格式。 6.0 6.0
param 宣告一個局部或全域參數。 6.0 6.0
preserve-space #用來定義保留空白的元素。 6.0 6.0
#processing-instruction 產生處理指令節點。 5.0 6.0
sort 對結果進行排序。 6.0 6.0
#strip-space 定義空白字元應刪除的元素。 6.0 6.0
stylesheet 定義樣式表的根元素。 5.0 6.0
template 當指定的節點被比對時所應用的規則。 5.0 6.0
text 透過樣式表產生文字節點。 5.0 6.0
transform 定義樣式表的根元素。 6.0 6.0
#value-of 提取選定節點的值。 5.0 6.0
variable 宣告局部或全域的變數。 6.0 6.0
when 規定 c88e008ca37f641f1d68866f53b5c0de 元素的動作。 5.0 6.0
#with-param 規定需被傳入某個範本的參數的值。 6.0 6.0

以上就是瘋狂XML學習筆記(11)------ -----XSLT講解的內容,更多相關內容請關注PHP中文網(www.php.cn)!

 

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn