IT's AGENT
PHPでXSLを使う
Bottom

XMLのSORT

PHPのSimpleXMLではSortができないので配列に変換して処理していた。
でも、XSLTが利用できればXMLのSortなどいとも簡単。しかもスピーディーなリスポンスが期待できる。
自分は、データベーススペシャリストなので、RDBの利用を基本にしていたが、薬価の改正などで、一時的にしか意味のない新旧比較表を作成する場合、RDBを利用するとしたら、設計やデータインポートなどの労力に見合うメリットはない。

データはエクセル形式で厚労省のサイトからダウンロードできる。これをXMLに変換して、SimpleXMLを利用して表示すれば良いだけなので、
Excel+VBA+PHP+XMLが圧倒的にコストパフォーマンスが良い。
しかも、PHPのSimpleXMLはかなり高速に反応してくれる。薬価データは16,404件あったが、全件表示はそれなりに時間がかかるものの、
検索を掛ければ一瞬で反応してくれる。INDEXも無いのに。(まぁ、プレーンテキストですし)

RDBはトランザクション処理、ACID特性が問われるように、更新に対する堅牢性、永続性で圧倒的に優位。
XMLのデータ更新は非効率だし、心許ない。
データを見せるだけでもRDBにかなわないな、と思うのはSQLの自在性で、特にSort。 品名で或いはコードで並び替えたい、など。
PHPでXSLTを使って変換したXMLはDOMオブジェクトでSimpleXMLからは利用できない。
DOMオブジェクトからSimpleXMLオブジェクトに変換する関数 simplexml_import_dom()を利用すれば問題なかった。

速度的には、配列に変換する方がよいかもと思うが、配列でのSortはPHPでの処理によるのでコードが面倒になり、柔軟性に欠ける。
Sortする項目と ↑ascending・descending↓ の組み合わせの数分のXSLファイルを用意することになるが、
ユーザーインターフェース的にいくつかのSortが選べるページが作りやすいので、私的にはPHP+XML+XSLTの利用価値は高くなった。

XML

<?xml version="1.0" encoding="UTF-8"?>
<Root>
 <Yakka>
  <区分>
   外用薬
  </区分>
  <薬価基準収載医薬品コード>
   2219700G1039
  </薬価基準収載医薬品コード>
  <成分名>
   肺サーファクタント
  </成分名>
  <品名>
   サーファクテン気管注入用120mg
  </品名>
  <メーカー名>
   田辺三菱製薬
  </メーカー名>
  <薬価>
   80519.4
  </薬価>
  <旧名称>
   サーファクテン気管注入用120mg
  </旧名称>
  <旧薬価>
   86556.5
  </旧薬価>
  <差額>
   -6037.1
  </差額>
  <率>
   -7
  </率>
 </Yakka>
         …
</Root>
								

XSLT & PHP

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 <xsl:output method="xml" encoding="UTF-8"  indent="yes" />

 <xsl:template match="/">
  <Root>
   <xsl:apply-templates select="/Root"/>
  </Root>
 </xsl:template>
 <xsl:template match="/Root">
  <xsl:for-each select="Yakka">
   <xsl:sort select="差額" lang="ja" 
    data-type="number" order="ascending">
   </xsl:sort>
   <xsl:copy-of select="."/>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>
							

PHP

$xml = new DOMDocument ; 
$xml -> load ('shinyakka.xml'); 
$xsl = new DOMDocument ; 
$xsl -> load ($xsltname); 
$proc = new XSLTProcessor ; 
$proc -> importStyleSheet ($xsl);
$xmlData = simplexml_import_dom($proc -> transformToDoc($xml));
						
$xsltnameは引数によって指定するXSLシートのファイル名。
(data-type:number OR text)

Topへ
by IT's AGENT