PHP and XSLT 2.0

最近弄 srcset 支援的時候,一度需要 XSLT 2.0 的 xsl:function,所以研究一下要怎樣在 php 下可以使用 XSLT 2.0,PHP 自己的 extension 用的是 libxslt,只支援到 1.0,而且沒有支援 2.0 的計畫,所以就需要找其他的引擎,後來是看上 SAXON 這套 Java 寫的 XSLT Processor,有支援 XSLT 2.0,而且近期還有在更新,主要是由 Saxonica 這間公司維護的,有 open source 的 home edition。

找好引擎後第二步就是要怎樣用 PHP load Java 的程式來用了,本來是想看 PHP/Java Bridge,不過我覺得還要弄 proxy 有些麻煩,幸好有找到 XML_XSLT2Processor 這個專門來把第三方 XSLT 引擎包起來給 PHP 用的專案,用起來很簡單,API 開的和 PHP 自己的版本都一樣,只是產生物件時要跟他說是要用那個引擎,檔案位置在哪而已:

$proc = new XML_XSLT2Processor('SAXON9', './saxon/saxon9he.jar', 'JAVA-CLI');

像這樣,後面的用法就和以前都一樣了,設計的很不錯,等於可以只動兩行就換過去,不過實際上用了之後覺得,速度差太多 >_< ,而且我後來發現本來讓我想要使用 XSLT 2.0 的那個錯誤並不是因為需要 xsl:function,而是我沒把 namespace 搞好就去用 EXSLTtokenize 這個 function,後來根據 stackoverflow 上的 回答 改動之後,發現可以動我就換去 PHP extension 了。