【2/17】今年は「濃厚」技術トーク!@ITメールセミナー スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷

document関数で細分化されたXML文書を結合する

実体参照を使わずに複数のXML文書を結合するには、XPathのdocument関数を使って外部のXMLファイルを取り込みます。この方法の利点は、取り込みの際にフィルタリング処理を加えられることです。

カテゴリ   XPath
関連要素  document
関連記事  実体参照宣言を利用して、XML文書を分割管理する

山田祥寛
2003/12/10

 別稿「実体参照宣言を利用して、XML文書を分割管理する」では、分割されたXML文書をDTD実体参照)を利用して結合する方法を紹介しました。XML文書を分割することによるメンテナンスのしやすさ、ドキュメントの再利用性といったメリットは、そちらでも述べたとおりです。

 しかし、実体参照による結合は手軽ではあるものの、柔軟性という意味ではいまいちです。というのも、固定的に記述された実体参照はあくまで「静的な」記述であるため、必ず一度はすべてのデータを取り込まなければなりません。取り込みの際にある条件で抽出を行うような絞り込みはできないのです(表示時にはXSLTでフィルタリングを行うにせよ、それはあくまで一度は結合した後の処理です)。

 しかし、本稿のテクニックを用いることで、より柔軟な分割データの処理が可能になります。まずは具体的なサンプルを見てみましょう。サンプルは、取り込むXML文書の一覧を示したインデックスXML(books.xml)、個別のデータ本体を記述したbookX.xml(Xは連番)、そして取り込んだデータを表示するためのXSLTスタイルシート(tabl.xsl)から構成されます。サンプルを試す場合には、books.xmlから起動できます。

[books.xml]

<?xml version="1.0" encoding="Shift_JIS" ?>
<?xml-stylesheet type="text/xsl" href="table.xsl" ?>
<books name="書籍情報一覧">
  <book href="book1.xml" />
  <book href="book2.xml" />
  <book href="book3.xml" />
  <book href="book4.xml" />
  <book href="book5.xml" />
</books>

[book1.xml](book2〜5.xmlは同様の構成であるため省略)

<?xml version="1.0" encoding="Shift_JIS" ?>
<book isbn="ISBN4-7981-0189-3">
  <title>10日でおぼえるJSP/サーブレット入門教室</title>
  <author>Y.Yamada</author>
  <published>翔泳社</published>
  <price>2800</price>
  <publishDate>2002/05/17</publishDate>
  <description>サーバサイド技術の雄「<keywd>JSP/サーブレット</keywd>」をJava初心者でもわかる10日間のセミナー形式で紹介。</description>
</book>

[table.xsl]

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 version="1.0">
  <xsl:template match="/">
    <html>
    <head>
    <title><xsl:value-of select="books/@name" /></title>
    </head>
    <body >
    <h1><xsl:value-of select="books/@name" /></h1>
    <table border="1">
    <tr>
      <th>ISBNコード</th><th>書名</th><th>著者</th>
      <th>出版社</th><th>価格</th><th>発刊日</th>
    </tr>
    <xsl:for-each select="document(books/book/@href)/book">
      <xsl:sort select="published"
                data-type="text" order="descending" />
      <xsl:sort select="price"
                data-type="text" order="ascending" />
      <tr>
        <td nowrap="nowrap">
          <xsl:value-of select="@isbn" /></td>
        <td nowrap="nowrap">
          <xsl:value-of select="title" /></td>
        <td nowrap="nowrap">
          <xsl:value-of select="author" /></td>
        <td nowrap="nowrap">
          <xsl:value-of select="published" /></td>
        <td nowrap="nowrap">
          <xsl:value-of select="price" /></td>
        <td nowrap="nowrap">
          <xsl:value-of select="publishDate" /></td>
      </tr>
    </xsl:for-each>
    </table>
    </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

図 books1〜5.xmlの内容を一覧表示(クリックで拡大します)

 ポイントとなるのは、以下の部分です。

<xsl:for-each select="document(books/book/@href)/book">
  ……略……
</xsl:for-each>

 document関数は、XPath関数の中でもノードセット関数に分類される関数の1つで、引数に指定されたパスに合致するノード値をキーに、外部のXML文書を呼び出します。つまり、ここでは<book>要素のhref属性(books.xml)に示されたbookX.xmlを順に呼び出し、その配下の<book>要素について繰り返し処理を行うことを意味します。

 ここでは、books.xmlに書かれているものをすべて出力していますが、出力するものとしないものを分けて抽出することも可能です。この場合、books.xmlの各<book>要素にflag属性を追加し、出力したいものにtrue、出力したくないものにfalseと指定します。そのうえで、table.xslの<xsl:for-each>要素を以下のように書き換えます。

<xsl:for-each
 select="document(books/book[@flag='true']/@href)/book">

 すると、flag属性がtrueである文書のみが取り込まれ、一覧表示されます。flag属性がfalseであるものは取り込みそのものが行われませんから、flag属性がfalseである文書が多くなったとしても、処理パフォーマンスが低下することはありません。

 

「XMLテクニック集」

ホワイトペーパーTechTargetジャパン

XML & SOA フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

スキルアップ/キャリアアップ(JOB@IT)

- PR -
- PR -

お勧め求人情報

キャリアアップ 〜JOB@IT
@IT Special -PR-
  企業の仮想化に足りない“発想”とは?
仮想化運用管理のキモは意外なところに!

New!
  操作もマニュアルも分かりやすい!
ユーザー視点で開発されたPC管理ツール

New!
  仮想化すればコストは削減できるか?
仮想化に必要な「3つの視点」を解説する

  セキュリティを知り尽くす上野氏が登壇!
@ITメールソリューションLive! in Tokyo

  運用管理の課題を“2つの観点”から分析
ユーザー満足度の高い「仮想環境」とは?

  世界に通用するストレージの作り方とは?
製品に込めた思いを富士通の開発者に聞く

  OSSで手間も時間も、障害も減った――
「マピオンの事例」オープンソース活用法

  「ノートPCの持ち出し禁止」で大丈夫?
情報漏えいを防ぐ管理手法とインフラは?

  1日の処理を1秒に――MySQLの達人が語る
「コスト削減」できるチューニング

  ドキュメント作成を自動化して、SEの作業
効率を大幅アップ! Visio 2007の魅力

  急速に広がるHyper-Vでのサーバ仮想化
そのベストプラクティスをデルが解説

  @IT主催セミナーで語られた、「担当者に
求められるセキュリティ対策」をレポート

  @IT「Windows 7」 特設サイトオープン!
最新情報・移行ノウハウを公開しています