XSLT 筆記

2008/10/16
~ 阿亮 ~

XSLT 筆記


PS: 這是筆記,不是詳細的教學手冊

◎ XSLT 可用於 XML 轉換成其他格式的 XML, HTML 或其他格式檔,所以,將它視為

  • 檔案格式轉換程式
  • 或,一種 Template Engine

◎ 和 DOM Tree 的處理一樣,藉由 XPath 的方式來「指定」XML 文件內的特定 element,然後進行各 element 內容的萃取以及處理,一些可以縮寫的 XPath 語法

非縮寫 縮寫 說明
/ / root
child:para para 目前節點下所有 para 的子點 (只有下一層)
/child:para /para root 下所有 para 的子點
descendant::para .//para 目前節點下所有 para 的子點 (不限只有下一層)
/descendant::para //para root 節點下所有 para 的子點 (不限只有下一層)
attribute::id @id 具有 id 的屬性的節點
attribute::* @* 所有屬性的節點
child::chapter[position()=5] chapter[5]
child::chapter[attribute::id=”this-one”] chapter[@id=”this-one”]
child::chapter[not(attribute::include=”y”)] child::chapter[not(@include=”y”)]
/descendant::text() //text() 目前節點下的所有文字節點
child::part[attribute::num=”1″][attribute::draft=”y”] part[@num=”1″][@draft=”y”]
parent::node()[attribute::include=”y”] ..[@include=”y”] 選擇 include 屬性內包含 “y” 的母節點
/descendent::chapter[attribute::id and attribute::include] //chapter[@id and @include]

◎ 例子: 資料檔假設 data.xml

<?xml version="1.0"?>
<Position>
    <X>9</X>
    <Y>9</Y>
</Position>
<Position>
    <X>10</X>
    <Y>9</Y>
</Position>

我們可以撰寫一個 xsl 檔,假設為 extract.xsl

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

    <xsl:template match="Position">
           <xsl:value-of select="./X" />
           <xsl:text>,</xsl:text>
           <xsl:value-of select="./Y" />
    </xsl:template>

</xsl:stylesheet>

然後,我們可以抓個 XSLT Processor,比如 Saxon ,執行

java -jar saxon.jar data.xml convert.xsl

就會產生

9,9
10,9

的結果

◎ 當然,有其他更複雜的操作方式,略記一些常用的語法

  • xsl:apply-templates    整個 XSLT 的核心語法
  • xsl:template
  • xsl:value-of  select=xxx   將結果輸出
  • xsl:import  href=xxx   可以 reuse 其他 xsl 檔
  • xsl:include   同前者,唯相同定義出現,這個會中止 compile.
  • xsl:strip-space xsl:preserve-space   處理空白
  • xsl:output
  • xsl:key
  • xsl:decimal-format  用來設定數字的格式
  • xsl:namespace-alias
  • xsl:attribute-set   設定屬性組
  • xsl:variable  xsl:param   處理一些變數運算
  • 條件式判斷
    • xsl: if test=”xxx=1″
    • xsl:choose   xsl:when

◎ Saxon 是 for Java, 若要 C/C++ 版本,可以考慮

  • Xalan
  • Sablontron  (with expat XML processor)

◎ MacOSX 下用 MacPort 安裝

sudo port install saxon

安裝在  /opt/local/var/macports/software/saxon/8.9_0 目錄,可以在 .profile 內加下述這行,以簡化指令執行

alias saxon='java -jar /opt/local/var/macports/software/saxon/8.9_0/opt/local/share/java/saxon8.jar'

但要注意 saxon8 支援 XSLT2.0,所以,可能執行時會出現下述訊息

Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor

只要在 xsl:stylesheet version 的部份由原 1.0 改成 2.0 即可 pass 該訊息。

◎ 參考:

 



站內搜尋



本站其他服務

本站其他軟體



  • 下一班公車(nextBus)

    這個 app 只要開啟後,就根據定位幫你過濾出附近站牌的時刻表,以及提供相關公車預計到站的時間,方便您在很快時間內確定要坐的哪一班公車


  • 批踢踢快訊 (pttNews)

    身為鄉民的您,是不是常常覺得現在的批踢踢 (PTT) 閱讀器,明明您就只要看幾個板,都幫您分類好,但不是您要的?甚至您只想關注某個人(或某件事)的消息,卻散布在不同東西,找出來很辛苦? 這個 App 可以解決您這些問題,快來用吧!


  • 藝文快訊

    讓你可以輕鬆追蹤含有您想要關注關鍵詞的任何藝文活動訊息,只要有最新的資訊,「藝文快訊」即會推播通知給你.


  • 標案快訊

    讓你可以輕鬆追蹤含有您想要關注關鍵詞的任何採購標案,只要有最新的資訊,「標案快訊」即會推播通知給你.


  • 臉書粉絲專頁搜尋 (FPSearch)

    不用登入臉書即可搜尋臉書粉絲專頁(臉書粉絲團)所公開的文章。您可以指定特定日期範圍之前的文章,也可設定搜尋粉絲專頁內包含特定關鍵詞的文章。


  • 下一班高鐵 (nextTHSR)

    這個 app 只要開啟後,就根據定位幫你過濾出最近高鐵站的時刻表,不用再按任何按鈕了,方便您在很快時間內確定要坐的哪一班高鐵