IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  XML  >

データ用のXML: XPath 2.0の新機能

XPath 2.0で計画されているいくつかの機能の概要

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

原文はこちら

原文はこちら


レベル: 中級

Kevin Williams (kevin@blueoxide.com), CEO, Blue Oxide Technologies, LLC

2002年 9月 01日

この記事で、Kevin Williams氏はXPath 2.0に関する最新の情報を紹介し、XMLデベロッパーに役立つXPath 2.0の機能のいくつかの例を取り上げます。例は、XMLとXPathで提供されています。

XSLT 1.0とXPath 1.0は、元々XML文書にシンプルなスタイル言語サポートを提供することを意図しており、ブラウザーへのレンダリングのためにそれらの文書をHTMLに変換することが主な目的でした。しかしながら、XSLTとXPathが利用可能になって以来、当初は意図されていなかったさまざまなタスク(XML文書のデータの高度な操作 (集約(aggregation)、識別選択(select distinct)、リレーションシップ・ピボットなど) から、XML形式から別の形式へのXSLT変換に至る) が必要になりました。そこで、W3Cはこれらの仕様のバージョン2.0で、こうした技術を新しい方法で使用できるようにして、XSLTおよびXPathをさらにフレキシブルで強固なものにしようとしています。

前回の記事では、XSLTの新しい機能のいくつかを紹介しました。それで今回は、XPath 2.0の際立った点のいくつかを紹介します。紹介したい特長はたくさんありますが、1つの記事ですべてを説明することはできません。

この記事ではいくつかのプリフィックスを次のようにマッピングします。

  • xf: はXPath 2.0関数の名前空間 (http://www.w3.org/2002/08/xquery-functions) にマップされます。
  • xsl: プリフィックスはXSLT 2.0名前空間にマップされます。
  • xs: プリフィックスはXML Schema名前空間にマップされます。

xf:distinct-values関数

XSLT 1.0スタイルシートを処理するときにデベロッパーが直面する最も大きな問題の1つは、XMLでSQLのSELECT DISTINCTに当たるもの(つまり、ノード・セットを取って、それらのノードから固有の値のリストを戻す式) を書くことです。これはXSLT 1.0とXPath 1.0でも不可能ではありませんでしたが、非常に困難でした。基本的には、特定の順番で各ノードを評価して、その後、一致する他の特定のノードが処理されないかどうか引き続き確認するように、xsl:for-each ステートメントを書く必要がありました。XSLT 2.0では、新しく採用されるxf:distinct-values 関数によって、この問題は簡単に解決します。ここで、XMLの簡単な例をリスト1 に示します。


リスト1. 署名と著者名
                
<books>
  <book author="Kevin Williams" title="Professional XML 2.0" />
  <book author="Lewis Carroll" title="Alice in Wonderland" />
  <book author="Lewis Carroll" title="Through the Looking-Glass" />
</books>

上記の文書から、著者に関する情報を正規化して、 リスト2 のような文書を作成したいとします。


リスト2. 著者名別の書名
                
<authors>
  <author name="Kevin Williams">
    <book title="Professional XML 2.0" />
  </author>
  <author name="Lewis Carroll">
    <book title="Alice in Wonderland" />
    <book title="Through the Looking-Glass" />
  </author>
</authors>

これを行うには、XPath and XSLT 1.0ではリスト3 にあるような作業が必要でした。


リスト3. XPath 1.0でのSELECT DISTINCT
                
<xsl:template match="books">
  <authors>
    <xsl:for-each select="book">
      <xsl:sort select="@author" />
      <xsl:variable name="thisAuthor">
        <xsl:value-of select="@author" />
      </xsl:variable>
      <xsl:if test="count(preceding-sibling::book)=0">
        <author name="{$thisAuthor}">
          <xsl:for-each select="../book[@author=$thisAuthor]">
            <book title="{@title}" />
          </xsl:for-each>
        </author>
      </xsl:if>
      <xsl:if test="preceding-sibling::book[1]/@author != $thisAuthor">
        <author name="{$thisAuthor}">
          <xsl:for-each select="../book[@author=$thisAuthor]">
            <book title="{@title}" />
          </xsl:for-each>
        </author>
      </xsl:if>
      </xsl:for-each>
    </authors>
</xsl:template>

これでは記述するのがけっこう面倒で大変ですが、 xf:distinct を使用すると、リスト4 に示すように簡単になります。


リスト4. XPath 2.0でのxf:distinct
                
<xsl:template match="books">
  <authors>
    <xsl:for-each select="xf:distinct(book/@author)">
      <xsl:variable name="thisAuthor"><xsl:value-of select=".">
      <author name="{$thisAuthor}">
        <xsl:for-each select="book[@author=$thisAuthor]">
          <book title="{@title}" />
        </xsl:for-each>
      </author>
    </xsl:for-each>
  </authors>
</xsl:template>

これは、xsl:for-each-group とどのように違うのでしょうか ? xf:distinct は、XPathがインプリメントされていれば、どこででも使用することができるため、XQuery 1.0の一部として使用することができますし、また特別なXPathプロセッサーとしても使用することができます。 xf:distinct では、値によって他の処理を実行させることができます。それに対してxsl:for-each-group は、値の識別だけを個別に行います。

この1つの改良点だけでも、XSLTの作成者が文書のスタイル設定を行う際に直面する多くの問題が解決されます。この点以外にも、スタイルシート・プログラマーに役立つXSLTに対する変更点がたくさんあります。




上に戻る


xf:document関数

XSLT 1.0では、複数の文書を処理することは難問の1つでした。XPath 2.0の設計者は、賢明にもxf:document メカニズムを通して追加の文書処理機能を組み込みました。この関数によって、1つまたは複数の文書をURLからロードして処理することができます。たとえば、リポジトリー内にリスト5、6、および7 に示すタイプの文書があるとします。


リスト5. サンプル文書1
                
<part name="Grommets" size="3 in." color="blue" />


リスト6. サンプル文書2
                
<part name="Grommets" size="3 in." color="blue" />


リスト7. サンプル文書3
                
<part name="Grommets" size="3 in." color="blue" />

ここで、1つのディレクトリーの中にこれらの文書が500入っていて、blueの部品 (part) すべてのリストを作成したいとしましょう。Javaのような中間層言語でコードを作成してそれらの文書をそれぞれロードしてblueの部品を探すのではなく、すべての部品文書の場所をリストする索引 (リスト8) を作成します。


リスト8. 部分索引文書
                
<parts>
  <part file="part1.doc" />
  <part file="part2.doc" />
  <part file="part3.doc" />
</parts>

必要な作業を実行する、リスト9 にあるような単一のスタイルシートを作成することができます。


リスト9. 全文書に使用されるxf:document
                
<xsl:template match="parts">
  <blueParts>
    <xsl:for-each select="xf:document(part/@file)/*[@color='blue']">
      <part name="{@name}" size="{@size}" color="{@color}" />
    </xsl:for-each>
  </blueParts>
</xsl:template>

この技法は、ある情報を特定のサーバーに保管して、顧客情報を別のサーバーに保管する場合のように、コンテンツをネットワーク上に分散させるのに特に役立ちます。 xf:document を使用して他のURLから情報を引き出すスタイルシートを使用することによって、元のデータを作成場所に置いたままにすることができます。




上に戻る


xf:current-dateTime関数

スタイルシートがXML文書に適用される場合、変換結果の作成日付が出力に組み込まれると便利です。このことは、ユーザー・インターフェースを使用してHTML文書を作成する場合に特に重要です。このデータによって、キャッシュ・システムは情報のコピーがいつ不用になるかを判別することができます。現在の日付と時刻は、XPath 2.0のxf:current-dateTime 関数を使用して取得できます (リスト10 を参照)。


リスト10. xf:current-dateTime関数の例
                
<xsl:value-of select="xf:current-dateTime()" />

これは、リスト11 に示すようなストリングを戻します。


リスト11. xf:current-dateTime関数の結果の例
                
2002-09-17T18:22:08z

このストリングをそのまま使用することもできますし、結果の文書で使用するために他の日付形式に変換することもできます。




上に戻る


XML Schema互換性の向上

XPath 2.0はXSLT 2.0とXQuery 1.0で共用されるようになるため、XPathはXML Schemaに関してさらに強力なサポートが必要になります。実際、XPath 2.0のデータ・モデル全体は強く型定義されるようになっており、値は単純なストリング、数値、およびブール型ではなく、XML Schemaの仕様の一部として定義される基本型を使用するようになります。これらの値をある型から別の型へ、XPath 2.0での操作の一部として明示的に変換することができるように関数が一式用意されています。たとえば、型名を関数のように使用することによって値を別の型にすることができます。それで、たとえばリスト12 のコードを使用して値を無符号の整数にすることができます。


リスト12. XML Schemaタイプ変換の例
                
xs:unsignedInt(item)

XPath 2.0で強く型定義が行われることにより、XSLTスタイルシートによって作成された文書が、強く型定義されているXMLスキーマに対して確実に妥当性検証されるようにすることができます。XSLT 2.0以前は、たとえば数値が無符号の整数であることを保証する方法がありませんでした。そのため、スタイルシートによって無効な値が提供されないようにするためにXML Schemaの妥当性検証ステップが必要でした。

この記事では、XPath 2.0が提供する注目すべき点を概説しました。この技術が勧告に進められる間 (最低でも6か月間) にXPath 2.0の機能に通じておくなら、そのインプリメンテーションが始まるときには最大限に活用できるように備えることになります。



参考文献



著者について

Kevin Wiliams氏は、情報管理システムのためのXML設計を専門とするVeridianの一部門であるEquientの主任XMLアーキテクトです。XMLに関する数冊の共著がWrox Pressから出版されています。彼の連絡先はkevin@realworldxml.comです。Kevin Williams氏のWebサイト www.realworldxml.com では、XMLについて彼が思うこと、ヒント、秘けつ、大胆な主張について知ることができます。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



はいいいえわからない
 


 


12345
不充分・不完全である大変素晴らしい
 


この記事を共有する

はてなブックマーク はてなブックマーク livedoorクリップ livedoorクリップ del.icio.us del.icio.us Buzzurl(バザール) Buzzurl(バザール) Choix! Choix!
Saafブックマーク Saafブックマーク FC2ブックマーク FC2ブックマーク MM/memo MM/memo ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
CZブックマーク CZブックマーク newsing newsing




上に戻る


    日本IBMについて プライバシー お問い合わせ