XSLT範例

XML + XSLT 轉換 HTML 完整範例

準備兩份檔案:

  1. students.xml:原始資料XML文件,存放學生資訊
  2. transform.xsl:XSL樣式表,用來把XML轉成HTML網頁
    瀏覽器載入students.xml時,會自動套用XSLT規則渲染成網頁。

XML檔宣告編碼為 ISO‑8859‑1(西歐字元集),部分非英文文字無法正常儲存,直接出現亂碼;需要透過程式統一改成UTF‑8編碼,才能徹底解決亂碼問題。

students.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
<class>
    <student>
        <name>Tom</name>
        <age>12</age>
        <height>145</height>
    </student>
    <student>
        <name>Jack</name>
        <age>16</age>
        <height>175</height>
    </student>
    <student>
        <name>Smiths</name>
        <age>22</age>
        <height>245</height>
    </student>
</class>Code language: HTML, XML (xml)

重點說明:

  • <?xml-stylesheet ... ?> 處理指令:告訴瀏覽器使用transform.xsl轉換目前的XML
  • encoding="UTF-8" 支援各國語言字元,避免亂碼

transform.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
                <title>Student List</title>
            </head>
            <body>
                <h3>Student Name List</h3>
                <ul>
                    <!-- 迴圈讀取所有 class/student 節點 -->
                    <xsl:for-each select="class/student">
                        <li>
                            <xsl:value-of select="name"/>
                        </li>
                    </xsl:for-each>
                </ul>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>Code language: HTML, XML (xml)

核心語法解釋

  1. <xsl:stylesheet>:XSLT根標籤,宣告命名空間
  2. <xsl:template match="/">:比對XML根節點,轉換的進入點
  3. <xsl:for-each select="class/student">:逐一遍歷每個學生節點
  4. <xsl:value-of select="name"/>:取出<name>節點的文字內容

3、執行方式

  1. 把兩個檔案放在同一個資料夾
  2. 直接用瀏覽器打開 students.xml
  3. XSLT引擎自動完成轉換,最後渲染出HTML列表頁面
出現亂碼
  1. XML開頭設定 encoding="ISO‑8859‑1",該字元集不支援非英文內容;
  2. HTML的meta標籤編碼與檔案實際編碼不一致;
  3. 儲存檔案時編輯器的編碼不是UTF‑8;

顯示完整學生資訊

如果想同時顯示姓名、年齡、身高,替換迴圈區段:

<xsl:for-each select="class/student">
    <li>
        Name: <xsl:value-of select="name"/> ,
        Age: <xsl:value-of select="age"/> ,
        Height: <xsl:value-of select="height"/>
    </li>
</xsl:for-each>Code language: HTML, XML (xml)

Previous:
Next:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *