單元5-1:XSL XML的轉換語言 王豐緒 銘傳大學資工系
單元目標 了解XSL與XML的關係 了解XSL基本語法與要素
XSL轉換模板(Transformation Templates) XSL「可延伸排版樣本語言」(eXtensible Stylesheet Language) 作為定義XML文件轉換樣式的一種語言 利用XSL轉換格式的能力可以將XML專換成各種開放的格式(如XML, HTML等) 在XML文件中宣告使用XSL <?xml-stylesheet type="text/xsl" href=“XSL檔案位址" ?>
XSL與XML的關係 XSL是由一組轉換模板(Transformation Template)所組成 XML 文件 轉換 XSLT <?xml version=“1.0?> <?xml-stylesheet type="text/xsl" href ="test.xsl" ?> <booklist> <book> <title>Old Man</title> <author>F. H. Wang</author> </book> <title>Goodness</title> <author>C. T. Lee</author> </booklist> XML 文件 XSLT 處理器 轉換 結果(HTML) XSL 文件 (只抓到第一組?) <xsl:stylesheet version = “1.0” xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="/"> <h1> <xsl:value-of select="//title"/> </h1> <h2> <xsl:value-of select="//author"/> </h2> </xsl:template> </xsl:stylesheet> <h1>Old Man</h1> <h2>F. H. Wang</h2> 轉換模板
XSL語法基本概念 XSL程式本身也是XML文件 由一堆轉換規則所組成(甚至沒有任何規則也可以) 每一條規則利用XPATH指令指定規則的啟動節點 規則內部則指定轉換的動作, 或針對其他節點(也是用XPATH指令描述)啟動相關規則 <xsl:template match="xpath" > <h1>Test XSL</h1> <xsl:apply-templates select=“xpath2“ /> </xsl:template>
XSL程式執行的基本概念 XSL程式的執行是資料(節點)導向 XML DOM Tree XSL 程式 Rule 1: Action1 … Rule N: ActionN XSL Processor Action 輸出結果
A popular game in Taiwan 一個簡單的範例 <xsl:template match=“sports" > <h1> <xsl:apply-templates select=“game“ /> </h1> </xsl:template> <xsl:template match=“game" > <p> <xsl:value-of select=“@title“ /> is <xsl:value-of select=“.“ /> </p> <?xml version=“1.0”?> <sports> <game title = “baseball”> A popular game in Taiwan! </game> </sports> / / sports game title=“baseball” A popular game in Taiwan sports <h1>….. </h1> game XSL Processor <p>baseball is A popular game in Taiwan </p>
XSL基本指令元素 xsl:stylesheet xsl:template xsl:apply-templates xsl:value-of <xsl:stylesheet>....</xsl:stylesheet> xsl:template <xsl:template match=”xpath” > 利用「match」設定xpath 指令設定本規則的啟動節點 xsl:apply-templates <xsl:apply-templates select=“xpath” /> 在xpath指定的節點上逐一套用適當的模板 xsl:value-of <xsl:value-of select= “xpath”/> 取出xpath定位到的第一個節點的值
另一個範例 <xsl:stylesheet version=“1.0” xmlns:xsl=“http://www.w3.org/1999/XSL/Transform”> <!-- 沒有任何規則 --> </xsl:stylesheet > <?xml version=“1.0”?> <sports> <game title = “baseball”> A popular game in Taiwan! </game> </sports> / / sports game title=“baseball” A popular game in Taiwan sports game A popular game in Taiwan XSL Processor A popular game in Taiwan
XSL預設的模板(Templates) <xsl:template match=“/ | *”> <xsl:apply-templates /> </xsl:template> 此模板比對document node 以及element node,然後對其孩子節點繼續套用適當的模板 <xsl:template match=“text() | @*”> <xsl:value-of select=“.” /> </xsl:template> 此模板比對任何的文字節點 以及屬性節點,然後顯示該節點的值 <xsl:template match=“processing-instruction()| comment()” /> 此模板比對任何的PI節點 以及註解節點,然後不作任何處理(也就是忽略這些節點)
新增元素與屬性的XSL指令 新增元素 建立屬性 取得屬性 在輸出文件中建立一個元素標籤 <xsl:element name=”新增元素名稱”>...</xsl:element> 建立屬性 在輸出文件的元素內插入屬性 運用在一個元素標籤內或上述的<xsl:element>之內 <xsl:attribute name=”屬性名稱">屬性的值<xsl:attribute> 取得屬性 括弧 { } 加「@」 如 <xsl:element name=“{@title}”> … </xsl:element>
A popular game in Taiwan 新增元素與屬性的XSL範例 <?xml version=“1.0”?> <sports> <game title = “baseball”> A popular game in Taiwan! </game> </sports> <xsl:template match=“game" > <xsl:element name=“{@title}”> <xsl:attribute name=“des“ > <xsl:value-of select=“.“ /> </xsl:attribute> 我是新增的元素 </xsl:element> </xsl:template> / / sports game title=“baseball” A popular game in Taiwan <baseball des=“A popular …”> 我是新增的元素 </baseball> sports game XSL Processor
XSL的條件判斷指令 唯一條件判斷 多重條件判斷 <xsl:if test=”判斷條件”>...</xsl:if> <xsl:choose> <xsl:when test=”條件”>...</xsl:when> ..... <xsl:otherwise>...</otherwise> </xsl:choose>
A popular game in Taiwan 條件判斷的XSL範例 <xsl:template match=“game" > <xsl:if test=“@title=‘baseball’“ > <font color=“red”> <xsl:value-of select=“@title“ /> is <xsl:value-of select=“.“ /> </font> </xsl:if> </xsl:template> <?xml version=“1.0”?> <sports> <game title = “baseball”> A popular game in Taiwan! </game> </sports> / / sports game title=“baseball” A popular game in Taiwan <font color=“red”> baseball is A popular game in Taiwan </font> sports game XSL Processor
XSL的迴圈指令 xsl:for-each <xsl:for-each select=“xpath” > …(裡面的參考節點是xpath所定位的節點) </xsl:for-each> <xsl:sort order= “ascending | descending” select=“xpath2” /> 將for-each的結果依照某種xpath2順序來依序處理(遞增或遞減)
迴圈控制的XSL範例 XSL Processor <xsl:template match=“sports" > <xsl:for-each select=“game” > <xsl:sort order= “descending” select=“@title” /> <p> <xsl:value-of select=“@title“ /> is <xsl:value-of select=“.“ /> </p> </xsl:for-each> </xsl:template> <?xml version=“1.0”?> <sports> <game title = “baseball”> A popular game in Taiwan! </game> <game title = “tennisl”> A less popular game in Taiwan! </sports> <p> tennis is A less popular game in Taiwan </p> baseball is A popular XSL Processor
其他XSL基本元素 xsl:comment xsl:copy xsl:copy-of <xsl:comment>comment</xsl:comment> 輸出備註資料 xsl:copy <xsl:copy>…</xsl:copy> 將目前處理的節點輸出 (不包括子節點以及屬性節點) xsl:copy-of <xsl:copy-of select=“xpath” /> 將xpath所定位的XML節點輸出 包括其子孫節點以及屬性節點
節點複製的XSL範例一 XSL Processor <xsl:template match=“sports" > <xsl:copy > <p> <xsl:value-of select=“game/@title“ /> is <xsl:value-of select=“game“ /> </p> </xsl:copy> </xsl:template> <?xml version=“1.0”?> <sports> <game title = “baseball”> A popular game in Taiwan! </game> </sports> <sports> <p> baseball is A popular game in Taiwan </p> </sports> XSL Processor
節點複製的XSL範例二 XSL Processor <xsl:template match=“sports" > <?xml version=“1.0”?> <sports> <game title = “baseball”> A popular game in Taiwan! </game> </sports> <xsl:template match=“sports" > <xsl:copy-of select=“game” /> </xsl:template> XSL Processor <game title = “baseball”> A popular game in Taiwan! </game>
單元複習 XSL可作為XML文件的格式轉換器 介紹XSL基本語法與要素 XSL程式的架構與執行概念 XSL轉換規則的撰寫 各種轉換動作 新增元素,屬性 條件控制 迴圈控制 本投影片謹簡述若干基本XSL元素,同學仍須參考課本或講義更多細節