document関数で細分化されたXML文書を結合する
実体参照を使わずに複数のXML文書を結合するには、XPathのdocument関数を使って外部のXMLファイルを取り込みます。この方法の利点は、取り込みの際にフィルタリング処理を加えられることです。
カテゴリ | XPath | |
関連要素 | document | |
関連記事 | 実体参照宣言を利用して、XML文書を分割管理する |
別稿「実体参照宣言を利用して、XML文書を分割管理する」では、分割されたXML文書をDTD(実体参照)を利用して結合する方法を紹介しました。XML文書を分割することによるメンテナンスのしやすさ、ドキュメントの再利用性といったメリットは、そちらでも述べたとおりです。
しかし、実体参照による結合は手軽ではあるものの、柔軟性という意味ではいまいちです。というのも、固定的に記述された実体参照はあくまで「静的な」記述であるため、必ず一度はすべてのデータを取り込まなければなりません。取り込みの際にある条件で抽出を行うような絞り込みはできないのです(表示時にはXSLTでフィルタリングを行うにせよ、それはあくまで一度は結合した後の処理です)。
しかし、本稿のテクニックを用いることで、より柔軟な分割データの処理が可能になります。まずは具体的なサンプルを見てみましょう。サンプルは、取り込むXML文書の一覧を示したインデックスXML(books.xml)、個別のデータ本体を記述したbookX.xml(Xは連番)、そして取り込んだデータを表示するためのXSLTスタイルシート(tabl.xsl)から構成されます。サンプルを試す場合には、books.xmlから起動できます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
ポイントとなるのは、以下の部分です。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
document関数は、XPath関数の中でもノードセット関数に分類される関数の1つで、引数に指定されたパスに合致するノード値をキーに、外部のXML文書を呼び出します。つまり、ここでは<book>要素のhref属性(books.xml)に示されたbookX.xmlを順に呼び出し、その配下の<book>要素について繰り返し処理を行うことを意味します。
ここでは、books.xmlに書かれているものをすべて出力していますが、出力するものとしないものを分けて抽出することも可能です。この場合、books.xmlの各<book>要素にflag属性を追加し、出力したいものにtrue、出力したくないものにfalseと指定します。そのうえで、table.xslの<xsl:for-each>要素を以下のように書き換えます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
すると、flag属性がtrueである文書のみが取り込まれ、一覧表示されます。flag属性がfalseであるものは取り込みそのものが行われませんから、flag属性がfalseである文書が多くなったとしても、処理パフォーマンスが低下することはありません。
Copyright © ITmedia, Inc. All Rights Reserved.