<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>reality &#187; groovy</title>
	<atom:link href="http://www.reality.hk/articles/tag/groovy/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.reality.hk</link>
	<description>Reality is merely an illusion, albeit a very persistent one.</description>
	<lastBuildDate>Sun, 05 Sep 2010 14:37:02 +0000</lastBuildDate>
	<language>zh-tw</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>恒指有多高？</title>
		<link>http://www.reality.hk/articles/2007/01/03/668/</link>
		<comments>http://www.reality.hk/articles/2007/01/03/668/#comments</comments>
		<pubDate>Tue, 02 Jan 2007 17:33:13 +0000</pubDate>
		<dc:creator>小影</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[aastock]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[hsi]]></category>
		<category><![CDATA[jakarta]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[stock]]></category>

		<guid isPermaLink="false">http://www.reality.hk/articles/2007/01/03/668/</guid>
		<description><![CDATA[恒生指數在2007年第一個交易日再創新高，以接近全日高位的20310.18點收市，全日升345.46點。 人人也說股市升得太勁太高，怎樣才是太高呢？市盈率是其中一個指標。由於恒指成份股佔了大市重大的比重，由他們的平均市盈率可以看到整體大市的熾熱程度。 怎樣才可以知道最新的恒指平均市盈率呢？個別股份的市盈率在財經網站不難找到，不如試試DIY一個小程式去幫手吧，它要有以下功能： 由財經網站下載成份股的市盈率 計算他們的平均值 時間無多，趕快準備今次的材料： Groovy Jakarta Commons HTTP Client 提供市盈率資料的網站，如AAstock &#8230;由於時間關系，程式己經準備好了，看看執行的結果： {[.src-1 /enzymes/chili-js.php]} 原來平均市盈率只有17.35&#8230; 這看來並不算高？ 利用Java, Groovy和HttpClient，這種以前頗麻煩的程式現在只需百多行源碼就攪定了。源碼並不很groovy，基本上還是使用java的寫法。由於太簡單，講解也是多餘的，請看看內容吧： PeRatioCalculator.groovy {[.src-2 /enzymes/java.php]} pe.properties {[.src-properties /enzymes/java.php]} (注：以上數字是單純的平均數，認真來說要同時計算各股票佔大市的比重！這就當作功課留給大家努力了&#8230;) (注2：另外以上所有言論只屬個人研究用途，本人並不保以上信息全部或部份可靠、準確或完整。本文不構成任何投資建議、要約或要約邀請。)]]></description>
			<content:encoded><![CDATA[<p>恒生指數在2007年第一個交易日再創新高，以接近全日高位的20310.18點收市，全日升345.46點。</p>
<p>人人也說股市升得太勁太高，怎樣才是太高呢？市盈率是其中一個指標。由於恒指成份股佔了大市重大的比重，由他們的平均市盈率可以看到整體大市的熾熱程度。</p>
<p>
怎樣才可以知道最新的恒指平均市盈率呢？個別股份的市盈率在財經網站不難找到，不如試試DIY一個小程式去幫手吧，它要有以下功能：</p>
<ol>
<li>由財經網站下載成份股的市盈率</li>
<li>計算他們的平均值</li>
</ol>
<p>時間無多，趕快準備今次的材料：</p>
<ol>
<li>Groovy</li>
<li>Jakarta Commons HTTP Client </li>
<li>提供市盈率資料的網站，如AAstock</li>
</ol>
<p><span id="more-668"></span></p>
<p>&#8230;<strong>由於時間關系</strong>，程式己經準備好了，看看執行的結果：</p>
<p>{[.src-1 /enzymes/chili-js.php]}</p>
<p>原來平均市盈率只有17.35&#8230; 這看來並不算高？ </p>
<p>利用Java, Groovy和HttpClient，這種以前頗麻煩的程式現在只需百多行源碼就攪定了。源碼並不很groovy，基本上還是使用java的寫法。由於太簡單，講解也是多餘的，請看看內容吧：</p>
<h3>PeRatioCalculator.groovy</h3>
<p>{[.src-2 /enzymes/java.php]}</p>
<h3>pe.properties</h3>
<p>{[.src-properties /enzymes/java.php]}</p>
<p>(注：以上數字是單純的平均數，認真來說要同時計算各股票佔大市的比重！這就當作功課留給大家努力了&#8230;)<br />
(注2：另外以上所有言論只屬個人研究用途，本人並不保以上信息全部或部份可靠、準確或完整。本文不構成任何投資建議、要約或要約邀請。)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.reality.hk/articles/2007/01/03/668/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用Groovy作XML-RPC Client</title>
		<link>http://www.reality.hk/articles/2006/02/08/571/</link>
		<comments>http://www.reality.hk/articles/2006/02/08/571/#comments</comments>
		<pubDate>Wed, 08 Feb 2006 12:55:43 +0000</pubDate>
		<dc:creator>小影</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[distributed_computing]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[webservice]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xmlrpc]]></category>

		<guid isPermaLink="false">http://www.siuying.net/articles/2006/01/20/571/</guid>
		<description><![CDATA[之前寫過使用Groovy作SQL和Reporting，今次再講講Groovy在Web的應用吧。 XML-RPC XML-RPC讓web application可以簡單地制作通用的接口，把不同地點、不同application間的互動變為可能。就以Word Press為例，它支援Blogger API, metaWeblog API, 和 Movable Type API，其他軟件可以通過XML-RPC讀取甚至更改這個blog的內容。 Its Groovy! Groovy內置了XML-RPC Server和Client，要建立和使用網路服務太容易了！看看以下的例子： [code lang="java"] package net.siuying.tagger import groovy.net.xmlrpc.* static final XMLRPC_URL = "http://www.siuying.net/xmlrpc.php" static final user = "xxxxx" static final password = "xxxxxx" def client = new XMLRPCServerProxy(XMLRPC_URL) try{ xmlRpcResponse = client.metaWeblog.getRecentPosts("1", user, password, 5) xmlRpcResponse.each() { article &#124; println "${article.postid}: [...]]]></description>
			<content:encoded><![CDATA[<p>之前寫過使用Groovy作SQL和Reporting，今次再講講Groovy在Web的應用吧。</p>
<h3>XML-RPC</h3>
<p>XML-RPC讓web application可以簡單地制作通用的接口，把不同地點、不同application間的互動變為可能。就以Word Press為例，它支援<a href="http://www.blogger.com/developers/api/">Blogger API</a>, <a href="http://www.xmlrpc.com/metaWeblogApi">metaWeblog API</a>, 和 <a href="http://www.sixapart.com/movabletype/docs/mtmanual_programmatic.html">Movable Type API</a>，其他軟件可以通過XML-RPC讀取甚至更改這個blog的內容。</p>
<h3>Its Groovy!</h3>
<p>Groovy內置了XML-RPC Server和Client，要建立和使用網路服務太容易了！看看以下的例子：</p>
<p>[code lang="java"]<br />
package net.siuying.tagger<br />
import groovy.net.xmlrpc.*</p>
<p>static final XMLRPC_URL = "http://www.siuying.net/xmlrpc.php"<br />
static final user = "xxxxx"<br />
static final password = "xxxxxx"</p>
<p>def client = new XMLRPCServerProxy(XMLRPC_URL)</p>
<p>try{<br />
        xmlRpcResponse = client.metaWeblog.getRecentPosts("1", user, password, 5)<br />
        xmlRpcResponse.each() { article |<br />
            println "${article.postid}: ${article.title}"<br />
        }<br />
}catch(XMLRPCCallFailureException ex){<br />
        println "Error Calling Remote Server: " + ex.getMessage()<br />
}<br />
[/code]</p>
<p>Groovy的XML-RPC就是這樣簡單！</p>
<h3>Pattern and Logic</h3>
<p>以上的程式做了甚麼？XMLRPCServerProxy 建立了一個 XML RPC Server Proxy。Server Proxy把內部的呼叫包裝成XML-RPC，通過http傳送去伺服器，再把伺服器的回應解封為groovy/java的物件。</p>
<p><b>注意</b>：這些東西一切都在背後完成，編程人員完全不用理會甚麼是XML-RPC、XML、HTTP、Database、Marshalling&#8230;只需像普通程式一樣呼叫就可以了！</p>
<p>呼叫伺服器端的XML-RPC就如呼叫本地的方法一樣，distributed computing從未試過這般簡單！接下來可以做甚麼？比如Blog Editor、Blog內容分析、建立搜尋器索引&#8230; </p>
<ul>
<li><a href="http://www.geekfishing.net/mt-static/docs/mtmanual_programmatic.html">Movable Type XML-RPC PROGRAMMATIC INTERFACES</a></li>
<li><a href="http://technorati.com/tags/XML-RPC">XML-RPC</a></li>
<li><a href="http://maisonbisson.com/blog/post/10600/">Of WordPress Tags, Keywords, XML-RPC, and the MovableType API « MaisonBisson.com</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.reality.hk/articles/2006/02/08/571/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用Groovy把SQL變成XML</title>
		<link>http://www.reality.hk/articles/2005/08/05/457/</link>
		<comments>http://www.reality.hk/articles/2005/08/05/457/#comments</comments>
		<pubDate>Fri, 05 Aug 2005 15:56:59 +0000</pubDate>
		<dc:creator>小影</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xslfo]]></category>

		<guid isPermaLink="false">http://www.siuying.net/?p=457</guid>
		<description><![CDATA[前文說過<a href="http://www.siuying.net/articles/2005/07/13/399/">怎樣把一個XML檔案轉換成任何文件檔案</a>，但在應用XSL-FO之前有一個問題，怎樣制作一個以資料為本的XML檔案？

你當然可以先用JDBC連接資料庫再用println把資料逐句列印出來，但我要說的是更優雅和簡潔的方法：<strong>用Groovy去把SQL轉換為XML！</strong>
]]></description>
			<content:encoded><![CDATA[<p>之前討論過<a href="http://www.siuying.net/articles/2005/07/13/399/">怎樣用XSL-FO把一個XML檔案轉換成任何文件檔案</a>，但在使用XSL-FO之前有一個問題：怎樣制作一個以資料為本的XML檔案？</p>
<p>你當然可以先用JDBC連接資料庫再用println把資料逐句列印出來，但我要說的是更優雅和簡潔的方法：<strong>用Groovy去把SQL轉換為XML！</strong></p>
<p><span id="more-457"></span></p>
<p>假如你還沒有聽過<a href="http://groovy.codehaus.org/">Groovy</a>，你只需知道這是一個在JVM中執行的動態腳本語言，它的特色包括靈活的語言特性、大量可用的library (包括所有Java的library)，可編譯為靜態Java Classes等等&#8230;它的語法很簡單，就算不懂Groovy也能看懂這篇內的例子！</p>
<p>以下是用Groovy向資料庫取資料並以XML輸出：</p>
<p><viewcode src="http://www.siuying.net/~siuying/code/groovy/sql.groovy" link="yes"/></p>
<p>真是太簡單了，認真地看就會發現真正地在工作的只有三行：</p>
<p>15：建立資料庫的連線<br />
18：建立制作XML的MarkupBuilder<br />
21：把Query結果以XML形式輸出</p>
<p>就這樣，沒有JDBC也沒有JAXP(呃&#8230;至少是表面上)，SQL就變成了XML！</p>
<p>下面是示例的XML輸出：</p>
<p><viewcode src="http://www.siuying.net/~siuying/code/groovy/output.xml" link="yes"/></p>
<p>對了，幾乎任何形式的資料也可用這麼簡單的方法由資料庫取出，配合XSLT和XSL-FO，任何報表也可以在幾句內攪定，<strong>工作真是太簡單了！</strong></p>
<h3>相關連結：</h3>
<ul>
<li><a href="http://dev2dev.bea.com/pub/a/2005/06/xml_bridge.html">XML as a Bridge between SQL and Web Applications</a> &#8211; Oracle的XML工具的範例</li>
<li><a href="http://groovy.codehaus.org/Groovy+SQL"> Groovy SQL</a> &#8211; Groovy的SQL範例，其中Test Case對明白Groovy SQL很有用</li>
<li><a href="http://groovy.codehaus.org/"> Groovy</a> &#8211; Groovy的主頁</li>
<li><a href="http://www.siuying.net/articles/2005/07/13/399/">XSL-FO，新的排版標準</a></li>
<p> &#8211; 簡介XSLT和XSL-FO的應用，把資料轉換為不同類型的輸出</p>
<li><a href="http://www-128.ibm.com/developerworks/java/library/j-pg01115.html">Practically Groovy: JDBC programming with Groovy</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.reality.hk/articles/2005/08/05/457/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XSL-FO，新的排版標準</title>
		<link>http://www.reality.hk/articles/2005/07/13/399/</link>
		<comments>http://www.reality.hk/articles/2005/07/13/399/#comments</comments>
		<pubDate>Tue, 12 Jul 2005 16:15:24 +0000</pubDate>
		<dc:creator>小影</dc:creator>
				<category><![CDATA[Diary]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[experiment]]></category>
		<category><![CDATA[fo]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xsl]]></category>
		<category><![CDATA[xslfo]]></category>
		<category><![CDATA[xslt]]></category>

		<guid isPermaLink="false">http://www.siuying.net/articles/2005/05/09/399/</guid>
		<description><![CDATA[XSL-FO ( Extensible Stylesheet Language - Formatting Object ) 是XSL下的一個XML應用，它是一種平面輸出的語言，讓用者以抽象的方式把文件輸出描述出來，可以想像是Word或者PDF的XML版本。]]></description>
			<content:encoded><![CDATA[<p>XSL-FO ( Extensible Stylesheet Language &#8211; Formatting Object ) 是XSL下的一個XML應用，它是一種平面輸出的語言，讓用者以抽象的方式把文件輸出描述出來，可以想像是Word或者PDF的XML版本。</p>
<p>在下文裏我會簡單地介紹XSL-FO、示範XSL-FO的結構、相關的技術和軟件、最後會講講怎樣在自己的軟件中利用XSL-FO去把輸出的邏輯簡化，從而<strong>讓軟件的輸出更美、更易制作又更易維護</strong>。</p>
<p><span id="more-399"></span></p>
<h3>為甚麼要有XSL-FO</h3>
<p>在WWW出現以來HTML就是網路最主要的文件。它的特點是它靈活地把文字和其他媒體結合，它的超連結可以將不同文件動態地連結起來。這種形式的資料雖然在電腦上很易應用，但由於它只是設計成在顯示器上顯示，要將HTML文件列印出來相當困難，作者很難控制客戶列印成品的效果。</p>
<h4>圖1：專業的網站都有所謂Print-Friendy版本 &#8212; 基本上只是白紙黑字的版本 &#8212; 因為普通的網頁不適合印刷，沒有辦法下，用純文字印刷效果反而較好 </h4>
<p><img src="/~siuying/images/html-out.gif" alt="所謂Print-Friendy版本" /></p>
<p>相對來說Microsoft Word或者Adobe Acrobat就是設計來作列印的，用者可以絕對地控制邊界、頁首頁尾以至圖表格式。但由於它們是封閉的標準，要制作和交換這些檔案有很大的限制。由於有需要開放的桌面排版標準，XSL-FO就此出現了。</p>
<h3>XSL-FO的概念</h3>
<p>為甚麼要叫FO ( Formatting Object )？這是由於這個語言以物件為本去排版。在W3C的XSL-FO標準中定義了56種不同的物件，利用它們，用者可以用任何可以想像的方式把文字、表格、圖片等等列印出來。例1是一個簡單的XSL-FO文件，它在一頁有一寸邊界的A4紙上印上兩句&#8221;Hello, World&#8221;字句，其中一句的H字是紅色的斜體字。</p>
<p>這個檔案最值得留意的是XSL-FO&lt;fo:layout-master-set&gt; 和&lt;fo:page-sequencet&gt;兩部份 ：前者定義了頁面的格式，後者定義了每一頁的內容。你也許會留意到，在layout-master-set中定義了一個叫my-page的Layout Master，之後的page-sequence應用了這個my-page的格式。就這幾個用Notepad都可編寫的文字就組成了一個XSL-FO的檔案，我們可以將它列印出來&#8230;等等，怎樣把這個檔案變成輸出？</p>
<h4>例1：Hello, XSL-FO！</h4>
<p><viewcode src="http://www.siuying.net/~siuying/code/xml/report-demo.fo"/></p>
<h3>將XSL-FO文件轉換和輸出</h3>
<p>Microsoft Word需要用Word開啟，Acrobat PDF需要用Acrobat開啟，同樣XSL-FO也需要它的閱讀器。越來越多軟件支援XSL-FO，其中有針對企業文件管理的應用幾乎都支援XSL-FO，如Adobe的 <a href="http://www.adobe.com/products/server/documentserver/xslfo.html">Adobe Document Server</a>和IBM的<a href="http://www.printers.ibm.com/internet/wwsites.nsf/vwwebpublished/ipmhome_x_ww?Open&#038;ca=daw-prod-xfc">Infoprint Manager</a>。</p>
<p>不過，這並不代表XSL-FO只是「另一種」檔案格式，最終的用者並不需要安裝特別的軟件，因為標準化的XSL-FO檔案可以輕易被轉換成其他常用的格式，過程如下圖所示。</p>
<h4>圖2：轉換XSL-FO成各種格式</h4>
<p><img src="/~siuying/images/XSLFO1.gif" alt="XSL-FO的應用" /></p>
<p>最為人熟識的XSL-FO轉換器是Apache組織的FOP ( Formatting Object Processor )。它可以將XSL-FO轉換成PDF, PCL, PS, SVG, XML (文件的樹狀結構), MIF，TXT，列印甚至在AWT中顯示出來。使用fop非常簡單，只要到他們的<a href="http://xml.apache.org/fop/download.html">下載站</a>下載最新版本，解壓後執行fop：</p>
<p><code>Fop -fo foo.fo -pdf foo.pdf</code></p>
<p><strong>如此簡單就可以將fo轉換成pdf！</strong>FOP還有很多用法 (如XSLT的支援，自定XML處理Filter等等)，詳情請讀<a href="http://xml.apache.org/fop/gethelp.html">他們的文件</a>。</p>
<p>你也許會想，看上來XSL-FO比文字檔和HTML複雜得多，要在程式中輸出XSL-FO會不會很難？沒錯手寫XSL-FO是不易，但另一種XML應用<strong>XSLT</strong>可以將這個過程簡化！</p>
<h3>把XML資料轉換為XSL-FO</h3>
<p>所有軟件都有三部份，輸入、處理和輸出。輸入可能是用者的輸入或者資料庫中的資料、處理則是把輸入作某種改變，可能是簡單的提取、計算數值、總結或者其他任何事、輸出則是把這些資料用我們可見或者感覺到的方式表現出來，其中最常用的方式就是把輸出到顯示器給用者看，其次就是把輸出寫到檔案中了。</p>
<p>傳統的顯示或檔案輸出很直接，把資料寫出來，就如這樣：</p>
<p><code>System.out.println("Hello, World!");</code></p>
<p>這在顯示無格式的純文字非常有效，但如果輸出是個有覆雜格式的檔案，在程式中直接輸出的結果就是把事務邏輯和表現邏輯混在一起，像這樣：</p>
<pre><code>System.out.println("+=============================================+");
System.out.println("+ Hello                 | World               |");
System.out.println("+-----------------------+---------------------+");
System.out.println("+ " + me.getHelloCount() + "| " + me.getWorldCount() + "|");
System.out.println("+-----------------------+---------------------+");</code></pre>
<h4>圖3：傳統的輸出方法</h4>
<p><img src="/~siuying/images/XSLFO-old.gif" alt="舊的應用" /></p>
<p>當輸出要改變 (比如是將第一行和第三行調換) 的時候，整個程式就要重新編譯，想要支援新的輸出格式？真是難以想像。如果只得簡單的檔案輸出，這個方法是沒問題的，但隨系統越來越覆雜，用戶的要求越來越多，這種結構將讓人疲於奔命 (<strong>我保證在真實的系統中，這是必然的事！</strong>)。</p>
<p>在這個時候，配合XSLT和XSL-FO可以把問題分解為可以處理的小事！請看下圖，這個新的結構的重點是<strong>把事務邏輯的程式和表現邏輯分開</strong>。</p>
<h4>圖4：活用XML的輸出方法</h4>
<p><img src="/~siuying/images/XSLFO-new.gif" alt="XSL-FO的應用" /></p>
<p>首先程式輸出<strong>XML格式的資料</strong>，這個資料檔案沒有任何有關表現的部份，只要把資料用合理的方式用XML編排就可以了。</p>
<p>接著為這個XML檔案編寫一個XSLT檔案 (XSLT是一種 XML 應用，它可以將一種形式的XML轉換成另一種XML)，由於前者的結構簡單，將XML資料轉換為理想輸出的XSLT也不會太複雜。XSLT的功能強大，不單簡單的重構頁面，甚至大小寫轉換、日期轉換、數字格式轉換都可以簡單在XSLT處理器中完成。這樣的結構把事務邏輯放在程式，把表現邏輯放在XSLT，需要把表現轉換時只要把XSLT更改就可，<strong>完全不用重新編寫程式</strong>！</p>
<p>用戶想要多一種輸出類型？只要把XSL-FO轉換成另一檔案即可。需要實物輸出？可以直接用FOP列印。想要無紙辦公室？你可以在程式中顯示輸出效果 ！(用FOP的Library這易如反掌！)。用戶的任何要求也可以輕鬆完成！</p>
<h3>總結</h3>
<p>這篇中我們簡單地看過了XSL-FO的概念，看過XSL-FO的組成，怎樣使用FOP把XSL-FO轉換成PDF，以及怎樣把普通的XML轉換為XSL-FO。當然時間關系，我每一步都只匆匆帶過，這裏我準備了一個簡單而實用的示例，可以看到怎樣把一個XML的報告轉變成實用的輸出，請參看下面源碼和 <a href="/~siuying/code/xml/report.pdf">示例輸出</a>(PDF)。如果你了解了XSL-FO的神奇，想認真地學習XSL-FO和XSLT的話，請找最下面的相關連結！</p>
<h4>例2：<a href="http://www.siuying.net/~siuying/code/xml/report.xml">report.xml</a>，資料為本的XML檔案，這是一個簡單的報告</h4>
<p><viewcode src="http://www.siuying.net/~siuying/code/xml/report.xml"/></p>
<h4>例3：<a href="http://www.siuying.net/~siuying/code/xml/report-fo.xslt">report-fo.xlst</a>，把上例2的XML轉換成XSL-FO的XLST</h4>
<p><viewcode src="http://www.siuying.net/~siuying/code/xml/report-fo.xslt"/></p>
<h4>例4：<a href="http://www.siuying.net/~siuying/code/xml/report.fo">report.fo</a>，轉換後的XSL-FO</h4>
<p><viewcode src="http://www.siuying.net/~siuying/code/xml/report.fo"/></p>
<h4>例5：用FOP將上面的XML和XSLT轉換為PDF的command</h4>
<p><code>fop -xsl report-fo.xslt -xml report.xml -pdf report.pdf</code></p>
<p><strong>相關連結：</strong></p>
<ul>
<li>本篇中所有檔案的<a href="http://www.siuying.net/~siuying/code/xml/xml.zip">源碼</a></li>
<li>Apache <a href="http://xml.apache.org/fop/">FOP</a>主頁</li>
<li>W3C的<a href="http://www.w3.org/TR/xsl/">XSL</a>標準 (可找到XSL-FO和XSLT的資料)
<li>
<li> IBM &gt; developerWorks &gt; XML &gt; <a href="http://www-128.ibm.com/developerworks/xml/library/x-xslfo/">Using XSL-FO to create printable documents</a>
<li>
<li>xml.com &#8211; <a href="http://www.xml.com/lpt/a/2002/03/20/xsl-fo.html">What is XSL-FO?</a></li>
<li>Oreilly &#8211; <a href="http://www.oreilly.com/catalog/xslfo/">XSL-FO</a></li>
</ul>
<p><strong>相關連結@零五年八月六日：</strong><br />
<a href="http://www.siuying.net/articles/2005/08/06/457/">用Groovy把SQL變成XML</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.reality.hk/articles/2005/07/13/399/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
