最近更新: 2008-01-25

How do you write template? XSLT, PHP or RoR?

Using XSLT, PHP, or Ruby on Rails to transform XML documents into XHTML documents. 展示 XSLT, PHP 與 Ruby on Rails 的樣版撰寫風格。

在使用樣版引擎之前,我們需要先將資料自外觀中分離,因此 A Note of HTML Form and XForm 算是本文的前置文章。當我們將資料和外觀分離時,我們將更進一步考慮如何將外觀樣版化。

XML document

<bookstore>
<catalog>

<cd>
  <title lang="eng">Harry Potter</title>
  <artist>Potter</artist>
</cd>

<cd>
  <title lang="eng">Learning XML</title>
  <artist>LMX</artist>
</cd>

</catalog>
</bookstore>

XSLT style

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
    <h2>My CD Collection</h2>
    <table border="1">
    <tr bgcolor="#9acd32">
      <th align="left">Title</th>
      <th align="left">Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
    </tr>
    </xsl:for-each>
    </table>
</xsl:template>
</xsl:stylesheet>

使用 XSLT 的優點在於樣版語法和伺服端實作工具無關。當網頁設計人員在設計網頁樣版時,不必知道程式開發人員使用什麼開發工具。當程式開發人員在爭論用 JSP, ASP.Net, PHP 或 RoR 開發時,那些事跟網頁設計人員一點關係都沒有。

現實問題則在於支援 XSLT 的網頁設計工具少,會使用 XSLT 的網頁設計人員更少。

PHP style

<?php
// Select data from XML document.
$xml = new SimpleXMLElement($xmlSource);
$resultSet = $xml->xpath('catalog/cd');

// Select data from database by a pseudo object, $db.
$db->select_db('root');  # match = "/"
$resultSet = $db->query('select * from catalog_cd;'); # select="catalog/cd"
?>

    <h2>My CD Collection</h2>
    <table border="1">
    <tr bgcolor="#9acd32">
      <th align="left">Title</th>
      <th align="left">Artist</th>
    </tr>

<?php foreach ($resultSet as $value) : ?>
    <tr>
        <td><?=$value->title ?></td>
        <td><?=$value->artist ?></td>
    </tr>
<?php endforeach; ?>
</table>

PHP 是比 XSLT 更早出現的樣版設計技術。但它同時也具有程式開發工具的特性,所以經過多年的快速發展後,晚近者對 PHP 的印象是「網頁開發工具」,而忽視了它作為樣版設計工具的一面。

PHP is itself a powerful template system, many developers feel it is too powerful or complex for their template designers ...
Zend Framework

由於 PHP 的功能太過強大 (對樣版系統而言),前些年有人另外發展了一些樣版引擎,例如 Smarty 。但我個人的建議是: 該遺忘它們了。如果你的開發團體想要尋找一個與開發工具無關的樣版系統,現在是該認真考慮 XSLT 的時候。延伸閱讀:

Ruby on Rails style

<%
// Select data from XML document.
xml = REXML::Document.new(xmlSource).root;
%>
    <h2>My CD Collection</h2>
    <table border="1">
    <tr bgcolor="#9acd32">
      <th align="left">Title</th>
      <th align="left">Artist</th>
    </tr>

<% REXML::XPath.each(xml, 'catalog/cd') do |value| %>
    <tr>
        <td><%=value.elements['title'].text %></td>
        <td><%=value.elements['artist'].text %></td>
    </tr>
<% end %>
</table>

Reference

樂多舊網址: http://blog.roodo.com/rocksaying/archives/5147001.html

樂多舊回應
jsj.500@gmail.com(jj) (#comment-15881829)
Mon, 03 Mar 2008 02:04:14 +0800
這三者放在一起比較蠻怪的..

XML,XSLT 是屬 frontend, 他的後端一定是需要配合上 CGI (php,perl,C++...)

XML+XSLT 放在 backend 亦可, 這樣組合出來輸出 html, 但還是需要有工具去處理 xml data (saxaon 和 xalan etc..)

PHP 在小專案(網站)上是可以不費神採用 template, 但是如果你建構的是中大型的網站, 你還是需要 template system, 當然你不一定要用 smarty, 但不用 smarty 不表示你不需要管理 template.

我六年前就學習使用過 xml+xslt, 當初也以為這種魔是會流行. 不過經過這麼久, xslt 始終不成氣候, 甚至連當初採用 xml+xslt 開發的 msn.com 都已經棄用這種方法. 原因還是在於 front-end 支援的 browser 只有 IE, 而內部處理轉換 xml data 的 cost 不低. 不夠便利, 效能不佳, 複雜度高, 造成它的使用率低

比較類似的技術反而是 ajax, 例如 gmail 把資料跟樣板區分開, 樣板全由 javascript 處理, 很多web2.0網站也用 json 包裝資料, 由前端 javascript 去處理資料顯示的部分
未留名 (#comment-15883511)
Mon, 03 Mar 2008 12:18:23 +0800
六年前,確實只有 IE 對 XML 的支援度較高 (我不記得那時它支援 XSLT)。但兩、三年前, Firefox 已經提供更好的 XML 與 XSLT 支援。

jj said: 處理轉換 xml data 的 cost 不低. 不夠便利, 效能不佳, 複雜度高, 造成它的使用率低


XSLT 不流行的原因,我想不是它效能不佳,我認為是它不便撰寫。請不要忘了,XSLT本身是一套語言。這也是我這篇文章的重點。同樣要描述樣版內容,大部份人選擇直接用和開發工具相同的語言去描述,例如 PHP 語言或 Ruby 語言。

不過,如果你採用的開發工具是 JSP 或 ASP.Net ,那麼用 Java 或 C# 去描述樣版內容同樣不方便,所以它們用另一套方式去處理。因此使用 JSP/ASP.Net 的開發團隊採用 XSLT 的比例大於使用 PHP/RoR 的開發團隊。

你說效能不佳的原因是「瀏覽器處理轉換 xml data 的 cost 不低」,我想這是不可能的。撇開 XSLT 不談,連最基本的 HTML 內容,實際上也是你口中的 "xml data",如果連處理 HTML 都效能不佳,那麼整個 web 環境都應該 "使用率低"。

jjsaid: PHP 在小專案(網站)上是可以不費神採用 template, 但是如果你建構的是中大型的網站, 你還是需要 template system


按 PHP/Zend 官方說法,PHP 是一套 template 系統 (too powerful),我十年前就是為了找一個比 SSI 更方便的 template system 才開始使用 PHP2/FI。

如果用 PHP "這麼強大的template system" 都不足以管理你的專案 template ,那麼你確實需要找一套更強大的 template system 。不過我目前還沒看到比 XSLT, PHP 這些現有技能更先進的 template system。

jj said: 比較類似的技術反而是 ajax, 例如 gmail 把資料跟樣板區分開


我在本文的前置文章 "A Note of HTML Form and XForm" 有提到,該文中比較了 HTML, XForm, Ajax 三種分離技術。