Like Share Discussion Bookmark Smile

J.J. Huang   2022-11-21   XML 2.延伸介紹   瀏覽次數:次   DMCA.com Protection Status

XML教學 | XML 和 XSLT

XSLT是什麼?

在電腦科學中,可延伸樣式表轉換語言(英語:Extensible Stylesheet Language Transformations,縮寫XSLT)是一種樣式轉換標記語言,
可以將XML資料檔轉換為另外的XML或其它格式,如HTML網頁,純文字。

XSLT最末的T字母表示英語中的「轉換」(transformation)。它是XSL規範中的一部分,目前最新的建議版本為XSL 3.0

  • XSLT 3.0:於201768日成為W3C推薦書。主要新功能有:

    • 流轉換:在以前版本中,整個輸入資料檔必須在處理之前被讀入記憶體,在處理完成之前無法寫到輸出(儘管Saxon有流擴展)。
      這個工作草案允許XML流,這對於處理記憶體容納不下的過大資料檔,或者在XML管道中連串變換時,是有用處的。
    • 改進大型樣式表的模組化。
    • 改進動態錯誤的處理,例如xsl:try指令。
    • 函式可以作為其他(高階)函式的參數。
  • XQuery比較:
    XSLT主要被認為是一種樣式語言,主要目標是在網路(當作網頁模板)、在螢幕或紙張,呈現給人類讀者觀看的XML
    XQuery則類比為傳統中的資料庫查詢語言。因為這兩種語言起源於不同的社群,XSLT偏重於處理彈性的敘述式資料應用上,而XQuery則偏重在資料處理方面,例如執行關係聯結的操作。

    註:後面才會做XQuery的介紹,這邊只是先拿出來做一個比較與知道。


設計模型與處理

XSLT處理器會取用一或多個XML源資料檔,加上一或多個XSLT樣式表,並處理它們以產生輸出檔案。
與廣泛實作的指令式程式語言(例如C程式語言)相反,XSLT是宣告式的。
基本處理的範式是模式配比。模板規則只定義如何處理特定XPath模式相符的節點,而不是列出在具有狀態的環境中執行的一系列動作;
處理器在遇到某一模式符合時,那麼模板規則的內容就包含了,以函數式語句評估的直接成果:即結果樹,它是處理器輸出的基礎。

處理器遵循固定的演算法。首先,假設樣式表已經讀取和準備好了,處理器從輸入的XML資料檔建立來原始碼樹。
然後處理來源樹的根節點,在樣式表中找到該節點相符的最佳模板,並評估模板的內容。
每一個模板中的指令通常要求處理器在結果樹中產生節點,或者與根節點相同的方式,處理來源樹中的其它節點。從結果樹中取得輸出。

  • XSL轉換處理程式示意圖:

簡單的範例

  • 輸入的XML文件內容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" ?>
    <persons>
    <person username="JS1">
    <name>John</name>
    <family-name>Smith</family-name>
    </person>
    <person username="MI1">
    <name>Morka</name>
    <family-name>Ismincius</family-name>
    </person>
    </persons>
  • 範例一:從XSL轉換為XML

    • XSLT樣式表提供了轉換XML文件的模板:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="xml" indent="yes"/>

      <xsl:template match="/persons">
      <root>
      <xsl:apply-templates select="person"/>
      </root>
      </xsl:template>

      <xsl:template match="person">
      <name username="{@username}">
      <xsl:value-of select="name" />
      </name>
      </xsl:template>

      </xsl:stylesheet>
    • 它的評估結果是一個新的XML文件,有另一種結構:
      1
      2
      3
      4
      5
      <?xml version="1.0" encoding="UTF-8"?>
      <root>
      <name username="JS1">John</name>
      <name username="MI1">Morka</name>
      </root>
  • 範例二:從XML轉換為XHTML

    • XSLT樣式表:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet
      version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns="http://www.w3.org/1999/xhtml">

      <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

      <xsl:template match="/persons">
      <html>
      <head> <title>Testing XML Example</title> </head>
      <body>
      <h1>Persons</h1>
      <ul>
      <xsl:apply-templates select="person">
      <xsl:sort select="family-name" />
      </xsl:apply-templates>
      </ul>
      </body>
      </html>
      </xsl:template>

      <xsl:template match="person">
      <li>
      <xsl:value-of select="family-name"/><xsl:text>, </xsl:text><xsl:value-of select="name"/>
      </li>
      </xsl:template>

      </xsl:stylesheet>
    • XML輸入檔案轉換則產生如下XHTML
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      <?xml version="1.0" encoding="UTF-8"?>
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head> <title>Testing XML Example</title> </head>
      <body>
      <h1>Persons</h1>
      <ul>
      <li>Ismincius, Morka</li>
      <li>Smith, John</li>
      </ul>
      </body>
      </html>
  • 範例二的執行效果:

  • 另外提供 w3schools - Try xml change html的線上範例。

結語

此章節「簡單」介紹了XSLT,使用簡單範例其訪問與操作。
這邊真的只是因為與XML相關,所以介紹了XSLT,後面會在另外開XSLT的教學。


註:以上參考了
w3resource.com - XML and XSLT
維基百科-XML
維基百科-XSLT
Family with 220 icons by inipagi