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)
◎ 參考:
Orignal From: XSLT 筆記