Vosegus Sakura

  1. Home
  2. Vosegus Labs
  3. PHP で XML を生成し、 XSLT に変数を渡して、1枚の XML ファイルで複数の情報の見せ方をする

PHP で XML を生成し、 XSLT に変数を渡して、1枚の XML ファイルで複数の情報の見せ方をする

Vosegus Labs

デモ (インデックスは通常のPHPです)

基本設計

PHPでXMLを生成し、XSLTに変数を渡して、1枚のXMLファイルで複数の情報の見せ方をする。というのをやってみたいと思います。

基本設計は以下のとおりです。

  1. XMLは管理画面から生成します。
  2. 実際に生成されるファイルはPHPです。それのheader情報を書き換え、MIME TypeをXMLに変更します。
  3. XML(PHP)は一枚のみ生成し、それをリソースとしてすべてのコンテンツを生成します。
  4. コンテンツの生成にはXSLTを使用します。XSLTには変数をセットし、変数の値によってXMLのトレースを操作します。
  5. 変数にはGETの値をセットします。XSLTのパスも同じように切り替えます。
  6. 最終的にXML(PHP)はXSLTによって変換され、htmlとしてブラウザに表示されます。

すべて一枚のファイルから生成されるので、実際には空間的階層構造というのは存在しませんが、概念的には以下のようになります。

ホームをルートとし、その下にカテゴリインデックス、さらにその下に各カテゴリのページ

利点としてはすべてのリソースの一元管理です。データベースでやれば? みたいなはなしは無視します。XMLでやりたいからです。

SEOに不利になるおそれもありますが、コンテンツが増えれば、ルートとなるXMLファイルをトレースし、各ページ毎にXMLを生成すればよいかと。

XMLはインデックスされるので。

XMLの設計

XMLの設計は以下の様になります

<global> <variable-xsl></variable-xsl> <category-num-array></category-num-array> <variable-node-array></variable-node-array> <keywords> <keyword></keyword> <keyword></keyword> <keyword></keyword> </keywords> <category id=“”> <title<家具</title> <unit> <product-name></product-name> <size></size> <maker></maker> <name></name> <read></read> <description></description> <price></price> <rating></rating> <images> <image></image> <image></image> <image></image> </images> <amazon-link> <![CDATA[]]> </amazon-link> </unit> </category> </global>

variable-xslはxslのパスを指定する変数です。category-num-arrayはカテゴリを指定する変数です。variable-node-arrayはアクセスするノードの配列を指定する変数です。

変数の設計

変数はGETで受け取ったものを、PHPで書き出し、

url?xslpath=Path&category=num&array=num

  • <category-num-array>GET['category']</category-num-array>
  • <variable-node-array>GET['array']</variable-node-array>

といった形になります。

XSLTの設計

PHPで書き出したXMLのノードバリューを受け取ってxsl:variableへセットします。

  • <xsl:variable name="category-num"><xsl:value-of select=“category-num-array”/></xsl:variablel>
  • <xsl:variable name="products-num"><xsl:value-of select=“variable-node-array”/></xsl:variablel>

セットしたxsl:variableをXPathとXSLTのパスへセットします。

  • <?xml-stylesheet type=“.text/xsl> href=“GET['xslpath']” ?> (global.php)
  • <xsl:value-of select=“./category[position()=$category-num]/unit[position()=$products-num]/images/image[1]” />

このページの上部へ