<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xsltMashupFiles/3-1xslt-mashup-001.xsl"?>
<!--
  Web2.0提言書：原稿「クライアントマッシュアップ」
<!DOCTYPE doc [
  <!ATTLIST chapter       id    ID      #IMPLIED>
  <!ATTLIST section       id    ID      #IMPLIED>
  <!ATTLIST subsection    id    ID      #IMPLIED>
  <!ATTLIST subsubsection id    ID      #IMPLIED>
  <!ATTLIST fig           id    ID      #IMPLIED>
  <!ATTLIST p             id    ID      #IMPLIED>
  <!ATTLIST li            id    ID      #IMPLIED>
  <!ATTLIST div           id    ID      #IMPLIED>
  <!ATTLIST span          id    ID      #IMPLIED>
  <!ATTLIST codeSample    id    ID      #IMPLIED>
  <!ATTLIST span          idref IDREFS  #IMPLIED>
]>
-->
<doc xmlns="http://www.xmlconsortium.org/wg/web2.0/teigensho/">
  <chapter type="skip"/>
  <chapter id="chapter-mashupExamples">
    <title>マッシュアップ・アプリケーションを組んでみる</title>
    <body>
      <p>
        Web上で公開されているWebAPIを利用したマッシュアップ・アプリケーションの例を取り上げてみる。
      </p>
      <section id="section-xsltMashup">
        <title>WebサービスをXSLTを利用してマッシュアップする</title>
        <creator>日本ユニシス株式会社 小林 茂</creator>
        <body>
          <p>
            Webブラウザを使って複数のREST型Webサービスを呼び出し，そこで得られた情報を基に，マッシュアップした内容を表示するアプリケーションを組んでみる。<span idref="section-xsltMashup"/>で紹介するマッシュアップの例は，XML，XSLTを利用しているので，以下ではXSLTマッシュアップと呼ぶことにする。ここに示す例では，WebブラウザとしてIE6を想定しており，他のブラウザではうまく稼動しない。XSLTプロセッサを用いて，予めHTMLに変換しておくことによって，他のWebブラウザでもみえるようになる。また，IE6においても，<span idref="allowAccess">ポップアップを許可すること，異なるドメイン間へのアクセスを許可すること</span>が必要となるので，閲覧，実行する際には，注意されたい。
          </p>
              <div class="note" id="note-canNotAccess">
                <div>【注意】</div>
                <div>異なるドメイン間のアクセス許可が与えられていない状態では，「XML ページを表示できません。XSL スタイル シートを使用した XML 入力は表示できません。・・・・。<strong>アクセスが拒否されました。</strong>」などのエラーとなったり，「このページは，制限外の情報にアクセスしています。セキュリティ上問題があり可能性があります。続行しますか?」のダイアログが出る。アクセス許可をする操作については，<span idref="trialXsltMashup"/>にある具体的な<span idref="allowAccess">手順</span>を参照のこと。</div>
              </div>
          <subsection><span idref="note-canNotAccess">表示できない</span>
            <title>XSLTマッシュアップ</title>
            <body>
              <p>ここに紹介するXSLTマッシュアップでは，マッシュアップに関わるWebサービスの情報，パラメタなどの基礎的なデータをXMLで保持し，そのXMLに関連付けたXSLTによって，REST型Webサービスを呼び出し，HTMLにまとめる形を採用することによって，簡単にマッシュアップ・アプリケーションができる。
              </p>
              <fig caption="XSLTマッシュアップの仕組み" id="fig-xsltMashup"
                   href="xsltMashupFiles/xsltMashup.gif"/>
              <p>XSLTマッシュアップでは，XSLTによる変換処理をどこで行うかによって，クライアント変換型とサーバー変換型の2つの種類がある。クライアント変換型のXSLTマッシュアップでは，WebサイトからXMLをダウンロードして，WebブラウザのXSLT変換処理を利用する。一方，サーバー変換型のXSLTマッシュアップでは，Webサービスの呼び出し時に変換指示用のXSLTを指定して，サーバー側でXSLT変換を行う。
              </p>
              <p>複数のWebサービスをマッシュアップする際に，Webサービスの連携の仕方によって，並列型と直列型がある。複数のWebサービスを順に呼び出し，その結果をマッシュアップする形態を並列型マッシュアップ呼ぶ。もう1つの形態である直列型マッシュアップは，1つのWebサービスを呼び出して，その応答メッセージからあるキーワードを抽出し，それを手掛かりに別なWebサービスを呼び出して，その結果をマッシュアップするという形態である。直列型では，はじめに呼び出したWebサービスの結果によって，それ以降のWebサービスが呼び出されるために，結果として得られるデータの意外性が生じやすい。<span idref="section-xsltMashup"/>で扱うWebサービスの種類とその内容について以下の<span idref="table-wsListDirectMashup"/>，<span idref="table-wsListMixedMashup"/>に示す。
              </p>
              <p><span idref="subsection-clientDirectMashup"/>に示す例では，クライアント変換型の直列型XSLTマッシュアップであり，<span idref="subsection-serverDirectMashup"/>の例では，サーバー変換型の直列型XSLTマッシュアップである。利用するWebサービスを<span idref="table-wsListDirectMashup"/>に示す。
              </p>
              <table class="wslist" id="table-wsListDirectMashup">
                <caption>直列変換型XSLTマッシュアップで使用するWebサービス</caption>
                <tr>
                  <th>サービス</th>
                  <th>内容</th>
                  <th>備考</th>
                </tr>
                <tr>
                  <td><url href="http://hon.jp/doc/about_rest.html">hon.jp</url></td>
                  <td>電子書籍の検索</td>
                  <td>hon.jpの電子書籍メタデータDBの内容を取得</td>
                </tr>
                <tr>
                  <td><url href="http://amazon.co.jp/">amazon.co.jp</url></td>
                  <td>書籍の検索</td>
                  <td>amazon.co.jpの書籍情報の内容を取得</td>
                </tr>
              </table>
              <p><span idref="subsection-gMapMashup"/>のWebサービスの例では，クライアント変換型で，直列型と並列型を混合させた形態である。利用するWebサービスを<span idref="table-wsListMixedMashup"/>に示す。</p>
             <table class="wslist" id="table-wsListMixedMashup">
               <caption>混合型XSLTマッシュアップで使用するWebサービス</caption>
               <tr>
                 <th>サービス</th>
                 <th>内容</th>
                 <th>備考</th>
               </tr>
               <tr>
                 <td><url href="http://www.kanzaki.com/test/exif2rdf">kanzaki.com</url></td>
                 <td>写真のメタ情報獲得</td>
                 <td>写真のメタデータをRDFとして獲得する</td>
               </tr>
               <tr>
                 <td><url href="http://weather.livedoor.com/weather_hacks/webservice.html">ウェザーハックス</url></td>
                 <td>お天気情報獲得</td>
                 <td>今日，明日，明後日の天気情報の取得</td>
               </tr>
               <tr>
                 <td><url href="http://maps.google.co.jp/maps">グーグルマップ</url></td>
                 <td>地図情報</td>
                 <td>位置情報を元に地図を表示</td>
               </tr>
               <tr>
                 <td><url href="http://hon.jp/doc/about_rest.html">hon.jp</url></td>
                 <td>電子書籍の検索</td>
                 <td>hon.jpの電子書籍メタデータDBの内容を取得</td>
               </tr>
               <tr>
                 <td><url href="http://jws.jalan.net/ws/viw/U00001">じゃらんWebサービス</url></td>
                 <td>宿・ホテル情報獲得</td>
                 <td>宿表示API ライトを利用</td>
               </tr>
             </table>
              <p>
              </p>
            </body>
          </subsection>
          <subsection id="subsection-clientDirectMashup">
            <title>クライアントサイドでできるXSLTマッシュアップ</title>
            <body>
              <p>はじめにクライアントサイドでXSLT変換を行う例を紹介する。利用するWebサービスとしては，hon.jp (<url>http://hon.jp/</url>)で提供される電子書籍の<url href="http://hon.jp/doc/about_rest.html">情報サービス</url>及びアマゾン(<url>http://amazon.co.jp/</url>)で提供される書籍情報の2種類である。利用者からhon.jpの情報提供サービスを用いて，キーワード検索をし，電子書籍を5冊リストアップし，そのうち書籍として発行しISBNがあるものは，アマゾンの書籍情報サービスを利用して表紙の画像を得て，詳細情報にリンクを張るという内容である。
              </p>
              <p>入力となる情報をXML(以下，入力XML)として作成し，それに対するスタイルシートをXSLTで作る。XSLTの内容はWebブラウザで表示させるべくHTMLに変換する指示を記述している。Webブラウザ上で2種類のWebサービスから得た情報をマッシュアップして表示するという簡単な仕掛けである。
              </p>
              <p>この例では，入力XMLの中に，利用者の希望する検索キーワードを指定するようになっており，利用者の任意の語を設定できる。この入力XMLを利用者の望む形で作成するインタフェースを設けることによって，より実用的なアプリケーションとすることができる。ここではXSLTを利用したごく簡単なマッシュアップの例(<span idref="fig-clientXsltMashup01a"/>参照：
                <url href="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/dispHonStyle1.xml"
                >dispHonStyle1.xml</url> )を紹介する。
              </p>
              <fig caption="クライアント変換型XSLTマッシュアップ(1)" id="fig-clientXsltMashup01a"
                   href="xsltMashupFiles/clientXsltMashup01a.jpg"/>
              <p>入力となる情報は，検索のためのキーワード(この例では「野球」)，一回の要求で表示する最大件数(5件)，件数が多いときにページが分割されるため，そのページ番号(この例では一ページ目)という情報であり，これを入力XML(ファイル名：dispHonStyle1.xml)として定義する。hon.jpのWebサービスを利用する場合には，アクセスのためのIDが必要となるので，この値もこの入力XML内に指定しておく。各自で実際に試す場合には，是非自分用のIDを取得して使っていただきたい。<span idref="fig-clientXsltMashup01a"/>の画面上では上部に入力XMLの内容を表示させている。ここでのIDは，お試し用IDを使用している。
              </p>
<codeSample caption="入力XMLの内容(dispHonStyle1.xml)" id="code-入力XMLの内容dispHonStyle1.xml"
><![CDATA[<hon:hon xmlns:hon="urn:hon">
  <hon:baseUrl>
    <hon:honBaseUrl href="http://hon.jp/rest/1.0/"/>
    <hon:xsltBaseUrl href="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/"/>
  </hon:baseUrl>
  <hon:ids>
    <hon:honUserId>aRUIO00003</hon:honUserId>       ←本運用までのお試し用IDを使用
  </hon:ids>
  <hon:stylesheet>
    <hon:style>
      <hon:description xml:lang="ja">
        単一スタイルシートでマッシュアップ (クライアント変換型)
      </hon:description>
    </hon:style>
  </hon:stylesheet>
  <hon:params>
    <hon:param name="keyword" value="野球"/>          ←キーワードの指定
    <hon:param name="max" value="5"/>                 ←1ページ内件数の指定
    <hon:param name="page" value="1"/>                 ←ページ番号の指定
  </hon:params>
</hon:hon>]]></codeSample>
              <p>この入力XMLに対して，スタイルシート(XSLT，<url href="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/dispHonStyle1.xsl.xml">dispHonStyle1.xsl.xml</url>)を用意して，まずは画面の上部に入力の内容を示す表(table)を生成する指示を記述する。その後でhon.jpのWeb APIを呼び出し，電子書籍の情報を獲得し，表の下部左側部分の各セルに対応する情報を埋め込む。
              </p>
              <p>次のXSLTのコード(<span idref="code-honjpWS呼び出し"/>)は，入力XMLで指定されるhon.jpのWeb APIを呼び出すURLの定義と実際に呼び出す部分である。ベースとなるURLの後に，利用者ID(uid)を付け，xsl:for-each命令を使ってパラメタとなるキーワード，最大件数，パージ番号を巡回的に付加してアクセス用のURL(accessUrl)を定義している。そして3段落目がそのURLを使って，Webサービスを呼び出すコードである。hon.jpのWeb APIはREST型のWebサービス呼び出しであり，HTTPのGETを利用しているために，XSLTでは，document関数を使って，そのWeb APIを呼び出すことが可能な点に注目して欲しい。
              </p>
<codeSample caption="hon.jp のWebサービス呼び出しXSLTコード" id="code-honjpWS呼び出し"
><![CDATA[<xsl:variable name="honBaseUrl" select="/hon:hon/hon:baseUrl/hon:honBaseUrl/@href"/>

<xsl:variable name="accessUrl">
  <xsl:value-of select="$honBaseUrl"/>
  <xsl:value-of select="/hon:hon/hon:params/hon:param[@name='keyword']/@value"/>
  <xsl:text>/</xsl:text>
  <xsl:value-of select="/hon:hon/hon:ids/hon:honUserId"/>
  <xsl:text>/</xsl:text>
  <xsl:for-each select="/hon:hon/hon:params/hon:param[@name!='keyword']">
    <xsl:if test="position()!=1">
      <xsl:text>&amp;</xsl:text>
    </xsl:if>
    <xsl:value-of select="@name"/>
    <xsl:text>=</xsl:text>
    <xsl:value-of select="@value"/>
  </xsl:for-each>
</xsl:variable>

<xsl:variable name="honjpDoc" select="document($accessUrl)"/>]]></codeSample>
              <p>この結果，Web APIで呼び出された情報は，XSLTの中では，"honjpDoc"という名前のドキュメントノードとして取り扱うことが可能となる。ここで応答として得られるXMLの中身については，hon.jpのサイトにあるドキュメントを参照して分かるように，ルート要素を"ProductInfo"として持ち，その子要素として，1個の"request"及び複数個の"results"などの要素を持つ構造をしている。results要素が1つの電子書籍の情報を持つ。因みにresults要素は，最大件数を5に設定したために，ここでは5個以下のはずである。hon.jpからの応答XMLが具体的にどんな内容かを確かめるために，上記のアクセス用URLを実際に手作業で作りあげ，Webブラウザ上で呼び出してみるとよくわかる。
              </p>
<codeSample caption="hon.jp のWebサービス呼び出しurlの例" id="code-honjpWS呼び出しurl"
><url href="http://hon.jp/rest/1.0/野球/aRUIO00003/max=5&amp;page=1"><![CDATA[http://hon.jp/rest/1.0/野球/aRUIO00003/max=5&page=1]]></url>
                              ↑IDとして本運用までのお試し用IDを使用</codeSample>
              <p>このリクエストによって，応答されたXMLを見ながらXSLTのコード作成などを作成すると良い。このURL上ではキーワードが漢字表記されているが，Webブラウザ(IE6)上では，エスケープされてアクセスされるためにこのままでも良い。
              </p>
              <p>このhonjpDocのノードの中で現れる要素"ProductInfo"を取り出し，XSLTのテンプレートを適用させるためには，次の様に，XSLTのxsl:for-each命令を使うことで達成される点を注目したい。
              </p>
<codeSample caption="xsl:for-eachを用いた他ドキュメントの処理" id="code-for-eachDocument"
><![CDATA[<div class="result">
  <xsl:for-each select="$honjpDoc">
    <xsl:apply-templates select="ProductInfo"/>
  </xsl:for-each>
</div>]]></codeSample>
              <p>そして"ProductInfo"に対するテンプレートの中で，各results要素を取り出し，必要な情報をHTMLの表(table)に変換するコードが，<span idref="code-results要素の処理"/>である。
              </p>
<codeSample caption="results要素の処理" id="code-results要素の処理"
><![CDATA[<xsl:template match="ProductInfo">
  <table>
    <xsl:for-each select="results">
       <xsl:apply-templates select=".">
         <xsl:with-param name="nbr" select="position()"/>
       </xsl:apply-templates>
    </xsl:for-each>
  </table>
</xsl:template>

<xsl:template match="results">
  ここにresults要素の記述をする
</xsl:template>]]></codeSample>
              <p>"results"要素に対するテンプレートの中における1件分の処理の最後で，<span idref="fig-clientXsltMashup01a"/>の下部右側部分にアマゾン提供の画像情報を埋め込むための考慮をしておかなければならない。honjpDocノード内にあるISBN(sourceISBN_10要素)をキーとして，更にアマゾン提供のWeb APIを使って書籍データを獲得するために，またアマゾンWebサービスへのアクセス用のURLを作成しなければならない。<span idref="code-アマゾンWS呼び出し"/>では，最初の段落で情報の区切りごとに設定するコードを示している。各パラメタは，amazon.co.jpのWebサービスの規定に従って記述しなければならない。ISBN番号からハイフンを除いたものが，ItemId要素であるために，XPathのtranslate関数を使って，sourceISBN_10要素の中身からハイフンを削除している点に注意。
              </p>
<codeSample caption="アマゾンのWebサービス呼び出しXSLTコード" id="code-アマゾンWS呼び出し"
><![CDATA[<xsl:variable name="amzonIsbnCallUrlBase">
  <xsl:text>http://webservices.amazon.co.jp/onca/xml</xsl:text>
  <xsl:text>?</xsl:text><xsl:text>Service=AWSECommerceService</xsl:text>
  <xsl:text>&amp;</xsl:text><xsl:text>Version=2007-02-22</xsl:text>
  <xsl:text>&amp;</xsl:text><xsl:text>AWSAccessKeyId=ここにID情報を記述</xsl:text>
  <xsl:text>&amp;</xsl:text><xsl:text>Operation=ItemLookup</xsl:text>
  <xsl:text>&amp;</xsl:text><xsl:text>ResponseGroup=Medium</xsl:text>
  <xsl:text>&amp;</xsl:text><xsl:text>IdType=ASIN</xsl:text>
  <xsl:text>&amp;</xsl:text><xsl:text>ItemId=</xsl:text>
</xsl:variable>

<xsl:variable name="awsAccessUrl">
    <xsl:choose>
      <xsl:when test="sourceISBN_10 != ''">
        <xsl:value-of select="$amzonIsbnCallUrlBase"/>
        <xsl:value-of select="translate(sourceISBN_10,'-','')"/>     ←ハイフンの削除
      </xsl:when>
      <xsl:otherwise/>
    </xsl:choose>
</xsl:variable>

<xsl:variable name="ansXml" select="document($awsAccessUrl)"/>]]></codeSample>
              <p>そして，XSLTのdocument関数で獲得したWebサービスからの応答メッセージを，ansXmlという名前でドキュメントノードとして保持しておく。アマゾンWebサービスの情報から，画像情報を取り出す部分のコードは<span idref="code-アマゾン応答XMLから画像"/>の通り。
              </p>
<codeSample caption="アマゾン応答XMLから画像のURL情報を得る" id="code-アマゾン応答XMLから画像"
><![CDATA[<xsl:variable name="imgUrl" 
  select="$ansXml/aws:ItemLookupResponse/aws:Items/aws:Item/aws:SmallImage/aws:URL"/>

<img src="{$imgUrl}"/>]]></codeSample>
              <p>画像情報のURLを取り出すだけなので，XSLTでは，ドキュメントノードを示す$ansXml変数を使って，変数imgUrlの値として簡単に取り出せる。HTMLのimgタグのsrc属性にこの値を設定すれば，Webブラウザ上で表紙の画像が表示される。
XML，XSLTをダウンロードして，入力用XMLのデータを変更してみて，Webブラウザ(IE6)で見ることで是非確かめて欲しい。もう少し複雑な利用法や，パラメタを入れ替えて，複数のスタイルで見ることも可能になっているので，<span idref="trialXsltMashup"></span>を参照していただきたい。
              </p>
              <p><span idref="fig-clientXsltMashup02"/>の例(
                <url href="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/dispHonStyle2.xml"
                >dispHonStyle2.xml</url>
                )は，<span idref="fig-clientXsltMashup01a"/>とほぼ同様の処理をしているが，XSLTを分割して，xsl:import処理をしているところが異なっている。入力XMLを処理するXSLTから，hon.jpからの応答XMLを処理するXSLT(
                <url href="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/hon-style-01.xsl.xml"
                >hon-style-01.xsl.xml</url>
                )をインポートし，更にそのXSLTから，アマゾンWebサービスからの応答XMLを処理するXSLT(
                <url href="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/amazonIsbn2.xsl.xml"
                >amazonIsbn2.xsl.xml</url>
                )とから構成されている。それぞれのXSLTが，単独でそれぞれの応答XMLを処理するように作成されているおり，それらを，再利用する形となっている。
              </p>
              <fig caption="クライアント変換型XSLTマッシュアップ(2)" id="fig-clientXsltMashup02"
                   href="xsltMashupFiles/clientXsltMashup02.jpg"/>
              <p>
              </p>
            </body>
          </subsection>
          <subsection id="subsection-serverDirectMashup">
            <title>サーバーサイドXSLTマッシュアップ</title>
            <body>
              <p>hon.jpのWeb APIでは，パラメタの1つとしてXSLTを指定しサーバー側でXSLT変換をさせる方法も可能となっている。Web APIでのリクエスト時にXSLTソースのURLを指定することにより，サーバーサイドで変換を行いWebブラウザにはHTMLとして応答するために，XML，XSLTを直接支持しないWebブラウザでも利用できるところが便利である。但し，サーバーサイドでのXSLTプロセッサの能力によって，現実的にはすべてのXSLTの機能が使えるわけではないので注意する必要がある。また，サーバーサイドからURLを介してXSLTのソースを獲得しようと試みるため，XSLTソースは公開されていなければならない。従ってローカルなPC上にあるXSLTファイルを利用することはできず，公開サーバーの上に配置したXSLTファイルを使用しなければならない。
              </p>
              <p><span idref="fig-serverXsltMashup"/>は，サーバーサイドでXSLT変換を行わせるために用意した画面(
                <url href="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/dispHonStyle.xml"
                >dispHonStyle.xml</url> )である。
              </p>
              <fig caption="サーバー変換型XSLTマッシュアップの呼び出し画面" id="fig-serverXsltMashup"
                   href="xsltMashupFiles/serverXsltMashup.jpg"/>
              <p><span idref="fig-serverXsltMashup"/>は，hon.jpのREST型WebAPIを呼び出すためのパラメタ設定を画面上から選択させ，その応答に対してどのスタイルシートを適用させるかを指定するために，HTMLのform機能を用いて作成したものである。左端の通番欄のスタイルをチェックし，右側のパラメタを選んで，「hon.jpの呼び出し」ボタンをクリックすることによって，hon.jpにアクセスする。このソースは，XMLであり，パラメタとなる候補群を予め設定するようになっている。スタイルシート(
                <url href="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/dispHonStyle.xsl.xml"
                >dispHonStyle.xsl.xml</url> )では，そのXMLの内容をformを使うHTMLに変換している。ここでは4通りのスタイルを指定しているが，【1】はスタイル変換をしない指定であるため,パラメーターに応じて要求された応答としてのXMLが表示される。そのほかどんな形で変換しているかを概観したのが<span idref="fig-serverXsltMashup"/>である。
              </p>
              <fig caption="マッシュアップ呼び出し関連図" id="fig-serverXsltMashupPattern"
                   href="xsltMashupFiles/serverXsltMashupPattern.jpg"/>
              <p>
              </p>
              <p>【2】は"<url href="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/hon-style-00.xsl.xml"
              >hon-style-00.xsl.xml</url>"というスタイルシートを選択するものである。このXSLTは単独のファイル構成であり，xsl:import命令やXSLTのdocument関数を使用してはいない。ここで【2】をチェックしてから，下部のボタン「hon.jp呼び出し」をクリックすると，サーバーサイドによるXSLT変換が指示できる。結果の画面は，<span idref="fig-serverXsltMashup00"/>となる。
              </p>
              <fig caption="サーバー変換型XSLTマッシュアップ (hon-style-00.xsl.xml)" id="fig-serverXsltMashup00"
                   href="xsltMashupFiles/serverXsltMashup00.jpg"/>
              <p>
              この画面において，上部にあるWebブラウザのアドレス欄を良く見ると，「xslt=http%3A%2F%2F・・・%2Fhon-style-00.xsl.xml」という文字列を含んでいることがわかる。URLを示す文字列では，「%xx」は16進表現された文字コードを持つ文字であることを意味するので，「xslt=http://・・・/hon-style-00.xsl.xml」ということであり，XSLTファイル(hon-style-00.xsl.xml)を指定して，サーバーサイドでXSLT変換をすることを指定していることになる。その応答結果は，HTMLであり，そのHTMLがそのままWebブラウザで表示されている。
              </p>
              <p><span idref="fig-serverXsltMashup"/>で，【3】をクリックし，hon.jpを呼び出すと，XSLTファイル(
                <url href="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/hon-style-01.xsl.xml"
                >hon-style-01.xsl.xml</url>
                )を指定して，Webサービスを呼び出してみる。その結果はエラーとなりエラーメッセージを含む応答XML(<span idref="fig-errorResponseXml"/>)が返される。このメッセージでは，XSLTでの構文エラーであるこを示している。つまりサーバー側でのXSLT変換ができないということである。
              </p>
              <fig caption="XSLT構文エラーの応答XML" id="fig-errorResponseXml"
                   href="xsltMashupFiles/errorResponseXml.gif"/>
              <p>ここで指定したXSLTスタイルシートは，
                <url href="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/hon-style-01.xsl.xml"
                >hon-style-01.xsl.xml</url> であり，先に紹介したクライアントサイドXSLTマッシュアップの2番目(<span idref="fig-clientXsltMashup02"/>)の最下部に表示されているスタイルと同一である。インポート先のXSLTファイルの中でdocument関数を使っているのが，エラーの原因のようである。このエラーを回避するために，<span idref="fig-serverXsltMashup"/>の【4】を設けた。【4】では，Webサービスへの要求に対して応答されるXMLに，単純にXSLT指定(
                <url href="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/hon-style-01.xsl.xml"
                >hon-style-01.xsl.xml</url>
                )を指示するの処理命令(<span idref="code-スタイル指定処理命令"/>)を付加するだけとした。
              </p>
<codeSample caption="XSLTスタイルシートを指定する処理命令" id="code-スタイル指定処理命令"
><![CDATA[<?xml-stylesheet type="text/xsl" href="・・・/mashups/xslt/hon-style-01.xsl.xml"?>]]></codeSample>
              <p>その処理命令を生成するXSLTソースが<span idref="code-処理命令生成"/>
                (<url href="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/ref-hon-style-01.xsl.xml"
                >ref-hon-style-01.xsl.xml</url>)である。
              </p>
<codeSample caption="処理命令を生成させるXSLT" id="code-処理命令生成"
><![CDATA[<xsl:template match="/">
  <xsl:processing-instruction name="xml-stylesheet">
    <xsl:text>type="text/xsl" </xsl:text>
    <xsl:text>href="http://・・・・・/hon-style-01.xsl.xml"</xsl:text>
  </xsl:processing-instruction>
  <xsl:copy-of select="."/>
</xsl:template>]]></codeSample>
              <p>このスタイルシートを使うことによって，スタイルシートの引用指示をする処理命令が挿入されたXMLがWebブラウザに応答され，Webブラウザ側の処理でHTMLに変換されることになる。<span idref="fig-serverXsltMashup"/>の【4】ではこの方法を使っている。【4】にチェックを入れ，「hon.jp呼び出し」のボタンをクリックし，その結果をIE6で表示したものが<span idref="fig-resultHonStyle01"/>である。
              </p>
              <fig caption="ref-hon-style-01.xsl.xmlによる変換結果(IE6表示)" id="fig-resultHonStyle01"
                   href="xsltMashupFiles/resultHonStyle01.gif"/>
              <p>この方法を使って，現状では IE6で表示できているが，Firefox2.0では，XMLがテキストとして処理されているため，期待に反した表示になっている(<span idref="fig-errResultFF"/>)。一旦，ローカル環境にXMLを保存し，改めてそのXMLを表示させるとうまく見えるようになるはずである。
              </p>
              <fig caption="ref-hon-style-01.xsl.xmlによる変換結果 (Firefox表示)" id="fig-errResultFF"
                   href="xsltMashupFiles/errResultFF.gif"/>
              <p/>
            </body>
          </subsection>
          <subsection id="subsection-gMapMashup">
            <title>グーグルマップを利用したXSLTマッシュアップ</title>
            <body>
              <p>次にグーグルマップを利用したもう少し複雑な例を紹介する。まず<span idref="fig-gmapMashupa"/>の画面を見ていただきたい。
              </p>
              <fig caption="グーグルマップを利用したマッシュアップの例" id="fig-gmapMashupa"
                   href="xsltMashupFiles/gmapMashupa.jpg"/>
              <p>このWebページでは，中央部に地図が表示されており，そのすぐ下に4種類の写真が配置されている。更にその下方にその写真に関連した電子書籍の情報が出ている。画面の最上部には，このページを閲覧したときのその地域(東京)でのお天気情報が出ており，この日以降は，段々と天気が崩れていきそうなことが読み取れる。
              </p>
              <p>様々な情報が1つの画面に現れているが，その元になるのは，1つのXMLファイル(入力XML，
              <url href="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/photoMap-01.xml">photoMap-01.xml</url>)に指定されたデータである。右端の写真に関する情報は，<span idref="code-入力XMLの内容photoMap-01"/>のように記述されている。
              </p>
<codeSample caption="入力XMLの内容 (photoMap-01.xml)" id="code-入力XMLの内容photoMap-01"
><![CDATA[<photo      href="http://・・・・/mashups/xslt/photos/nagakute.jpg">
  <title>ビュッフェながくて</title>
  <description   flagIconUrl="・・・・/mashups/xslt/images/flag2_green.png">
       <html:span style="color:red;">ビュッフェ ながくて</html:span>
       <html:br/>
       <html:span style="color:blue;">
       >今は<html:em>記念公園</html:em> になっているぞ!</html:span>
  </description>
  <keywords>
       <keyword>長久手</keyword>
  </keywords>
</photo>]]></codeSample>
              <p>ここでは写真の在り処(URL)と，タイトル，説明用の記述及びキーワードの情報だけが指定されている。説明記述内には，名前空間の接頭辞として，”html”を付加した，HTMLタグが指定してあるため，少し複雑になっているが，テキストと，強調，色などのスタイルを指定している例である。
              </p>
              <p>ここで，<span idref="fig-gmapMashupa"/>の写真の上にある「地図表示【4】」と書かれたボタンをクリックすると，次の様に変化する。まず中央の地図として愛・地球博記念公園(愛知県長久手)付近が表示される。この中央にある黄緑の旗のアイコンをクリックした後の状態が<span idref="fig-gmapNagakute"/>に表示されている。出現した吹き出しの中に，先ほど指定した入力XML(<span idref="code-入力XMLの内容photoMap-01"/>)に指定されている説明の内容が，色つきで，しかも「記念公園」が強調されて斜体になっていることがわかる。
              </p>
              <fig caption="写真から得られた地図上の吹き出し" id="fig-gmapNagakute"
                   href="xsltMashupFiles/gmapNagakute.gif"/>
              <p>この写真は平成17年春から夏にかけて開催された愛知万博「愛・地球博」の会場で撮った写真である。そのときに撮影した場所が，地図上でこの緑の旗が置かれている場所だったのだ。現在は，愛・地球博 記念公園になっていることがこの地図から発見できる。
              </p>
              <p>この同じ写真(右端)の下には，「徳川家康(10) 無相門の巻」という電子書籍の情報が出ている。どうしてこのような情報が出ているかと言うと，先ほどの入力XMLデータ(<span idref="code-入力XMLの内容photoMap-01"/>)中にあるキーワード「長久手」から，hon.jpで提供されている電子書籍のWebサービスを検索した結果を表示しているからだ。電子書籍のタイトルの部分をクリックして，そこに張られているリンク先(<url href="http://hon.jp/search/2.2/null/15664/">hon.jpサイト</url>)を見ると，「長久手の地に、秀吉と家康は宿命の対陣に。和睦の条件は家康の次男を秀吉の養子にすること…。」と解説が出ている。この文があるために，キーワード「長久手」が検索で見つかったものと考えられる。
              </p>
              <p>写真情報と長久手というキーワードを基にして，地図情報とそれに関連する電子書籍情報とが結びついて，江戸時代にこの地で徳川家康が関係していたのだと言う知識までを，このマッシュアップで知ることができたことになる。このように異なるWebサービスをマッシュアップした効果によって，当初は思いも付かない情報が得られたという経験を持つことができたと考えられる。
              </p>
              <p>最初に与えた入力XMLデータ中(<span idref="code-入力XMLの内容photoMap-01"/>)に，愛知万博での撮影場所は，明示的には指定していないのにどうして位置がわかったのであろうか。その仕掛けはこの写真にある。この写真はGPS付き携帯で撮ったものであり，写真(JPEGファイル)中に位置情報を持っている。そのためその位置情報を取り出すことによって，位置がわかる。JPEG中には，EXIFと呼ばれる形式によって情報が記述されている。それを取り出すために，この例では「Exif to RDF」というWebサービス( <url>http://www.kanzaki.com/test/exif2rdf</url> )を利用している(<span idref="fig-exifToRdf"/>)。
              </p>
              <fig caption="Exif to RDF のサービスサイト" id="fig-exifToRdf"
                   href="xsltMashupFiles/exifToRdf.gif"/>
              <p>このサイトでは，HTMLのformによって，写真のURLを入力すると，RDFを返してくれることになっている。RDFというのは，メタデータを表現するXMLデータである。このRDFでは，この写真に関する様々なメタデータを持っている。XSLTマッシュアップの例では，その中から位置情報だけを利用させて頂いている。
位置情報を含む部分を示す(<span idref="code-RDFによる位置情報"/>)。
              </p>
<codeSample caption="RDFによる位置情報" id="code-RDFによる位置情報"
><![CDATA[<foaf:Image rdf:about="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/photos/nagakute.jpg">
    <dc:date>2005-05-15T11:52:22</dc:date>
    <dpd:generated rdf:parseType="Resource">
        <geo:lat>35.1762194444</geo:lat>
        <geo:long>137.085819444</geo:long>
    </dpd:generated>
    <exifdata rdf:resource="#Primary_Image" />
    <exifdata rdf:resource="#Thumbnail" />
</foaf:Image>]]></codeSample>
              <p>この中で geo:lat と geo:long 要素が経度・緯度による位置情報である。この値を取り出して，グーグルマップ上にその位置を表示するようにしている。
              </p>
              <p>
              </p>
              <p>次に，<span idref="fig-gmapMashupa"/>に戻って，「地図表示【1】」と書かれた写真を見る。この写真は豊洲にある会社(U社本社)の近くから撮った写真である。「地図表示【1】」のボタンをクリックし，地図中央の赤い旗のアイコンをクリックしたときの状態が<span idref="fig-gmapXbrl"/>である。
              </p>
              <fig caption="吹き出しにXBRL情報を表示" id="fig-gmapXbrl"
                   href="xsltMashupFiles/gmapXbrl.gif"/>
              <p>グーグルマップ中の吹き出しの中には，財務データ(一部)が記されている。この財務データは，XBRL形式で表現されており，その一部を取り出して編集した形で，欲しい情報を見ることができる。このXBRLデータは，正式に公開されているものではなく，筆者がテスト用に作成したものである。平成20年4月以降には，金融庁が提供するEDINETにて，XBRLにて正式に公開される予定なので，それらを利用することによって，取引企業の財務情報などを簡易に利用することが可能になるはずである。
              </p>
              <p>XBRLの情報を得るために，最初に与える入力XMLには，<span idref="code-XBRL-jalan"/>のような情報を与えている。具体的には，1つ目のinfo要素にて，XBRLであることの型の定義とXBRLデータのURLの指定している。XBRL情報を，吹き出し中に表示するためのXSLTは，ここでは説明しないが，興味ある人は，XSLTからインポートされるXSLTスタイルシートを参照していただきたい。
              </p>
<codeSample caption="入力XMLのXBRL，じゃらんに関する情報" id="code-XBRL-jalan"
><![CDATA[<photo href="・・・・/mashups/xslt/photos/uBuild.jpg"   label="U社">
    <title>U社本社</title>
    <description>
        <html:div>月島から見たU社</html:div>
        <html:div  style="color:brown;">財務データ(XBRL)：一部だけ</html:div>
    </description>
    <keywords>
        <keyword>月島</keyword>
    </keywords>
    <extrainfo>
        <info   type="xbrl-bs2"   url="・・・・/xml/xbrl/bs-NUL061-xbrl.xml"/>
        <info   type="jalanHotel"   
                url="http://jws.jalan.net/APILite/HotelSearch/V1/"
                key="cyg***********"                           ←ここのIDは各自で設定のこと
                 s_area="136202"   name="銀座・晴海・築地"
                icon="images/flag2_brown.png"
        />
    </extrainfo>
</photo>]]></codeSample>
              <p>この入力XML(<span idref="code-XBRL-jalan"/>)中には，もう1種類の拡張情報として，リクルート社が提供する「じゃらん」のホテル情報サービスの型(jalanHotel)を定義している。これはこの付近にあるホテルに関する情報を獲得するために必要な情報を指定するものである。グーグルマップ上では，茶色の旗のアイコンで示すような指定と，じゃらんのWebサービスを呼び出す際のキー情報，場所情報を指定している。茶色の旗をクリックすると，Webサービスから得た情報を吹き出しに編集して<span idref="fig-gmapJalan"/>のように表示される。
              </p>
              <fig caption="吹き出しにホテル情報を表示" id="fig-gmapJalan"
                   href="xsltMashupFiles/gmapJalan.gif"/>
              <p>このように1つの写真に関連させて，様々な情報を結び付け，利用者の想いを1つのページにマッシュアップしたアプリケーションとして作成することができる。入力XMLを介して，様々なWebサービスを呼び出しうまく連携させることによって，新たなアプリケーションが実現できることがわかる。1つの情報を基に様々なWebサービスが，直列的に，又は並列的に連携させることから，このようなデータを，ピボットデータと呼んでいる。このピボットデータをうまく設定し，活用することでこれまでにない新たなアプリケーションが出現することが期待できる。
              </p>
            </body>
          </subsection>
          <subsection id="trialXsltMashup">
            <title>見るだけではなく実際にやってみよう</title>
            <body>
              <p>これまではWebサイト上にあるXML，XSLTを指定して出来上がったものを見ているだけであった。今度は利用者が参加して，実際にXMLデータを触ってどの様に表示が変わるのかを実際に試してもらいたい。写真及び旗のアイコンはローカルな環境のものは使えないので，ダウンロードするのは，XMLとXSLTだけである。
              </p>
              <div>例1(<span idref="fig-clientXsltMashup01a"/>)では</div>
              <ul>
                <li>基本となるXMLファイル【dispHonStyle1.xml】</li>
                <li>XMLから直接指示するXSLTファイル【dispHonStyle1.xsl.xml】</li>
              </ul>
              <div>例2(<span idref="fig-clientXsltMashup02"/>)では</div>
              <ul>
                <li>基本となるXMLファイル【dispHonStyle2.xml】</li>
                <li>XMLから直接指示するXSLTファイル【dispHonStyle2.xsl.xml】</li>
                <li>dispHonStyle2.xsl.xmlから呼び出す体裁指示用のXSLTファイル【hon-style-01.xsl.xml】</li>
                <li>hon-style-01.xsl.xmlから呼び出すアマゾンWebサービス用のXSLTファイル【amazonIsbn2.xsl.xml】
</li>
              </ul>
              <div>例3(<span idref="fig-gmapMashupa"/>)では</div>
              <ul>
                <li>基本となるXMLファイル【photoMap-01.xml】</li>
                <li>XMLから直接指示するXSLTファイル【photoMap-01.xsl.xml】</li>
                <li>XSLTから呼び出すXBRLデータ処理用のXSLTファイル【getXbrlInfo1.xsl.xml】</li>
                <li>XSLTから呼び出すXBRLデータ処理用のXSLTファイル【getXbrlInfo2.xsl.xml】</li>
              </ul>
              <div>が必要である。</div>
              <p>ここでは，グーグルマップを利用する例(例3)について実際に見てみる。次の手順で準備をしていただきたい。
              </p>
              <ol>
                <li>まず下記に示すWebサイトからアーカイブファイルをダウンロードし，任意のフォルダに格納する。このファイルには，他の例のファイルも含まれている。
                  <url   title="アーカイブのダウンロード"
                          href="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/xsltMashup.zip"
                  ></url>
                </li>
                <li>photoMap-01.xml を修正する。
例えば，<span idref="code-入力XMLの内容photoMap-01"/>にて，説明記述の内容を変更することで，地図上の吹き出しを変更することができる。</li>
                <li>photoMap-01.xml をWebブラウザ(IE 6)で表示する。</li>
                <li id="allowAccess">IE6のWebブラウザでは，ポップアップがブロックされた状態，異なるドメイン間のアクセスが禁止の状態では，<span idref="note-canNotAccess">表示できない</span>ので注意のこと。許可するための設定は以下の通りである。
                  <ul>
                    <li>ポップアップがブロックの許可
                    <ol>
                    <li>「セキュリティ保護のため，・・・・」の警告が表示された場合，Webブラウザの指示に従って，「ブロックされているコンテンツを許可」をクリックする</li>
                    <li>「セキュリティの警告」に対して，「はい」をクリック</li>
                    </ol>
                    </li>
                    <li>異なるドメイン間のアクセス許可
                      <ol>
                        <li>IE 6のメニュから「ツール」・「インターネットオプション」クリック</li>
                        <li>インターネットオプションのダイアログで，「セキュリティ」タブをクリック</li>
                        <li>「レベルのカスタマイズ」をクリック</li>
                        <li>「ドメイン間でのデータソースのアクセス」で，「有効にする」にチェックして「OK」をクリック</li>
                        <li>以下，「OK」を答えて，「インターネットオプション」を閉じる</li>
                      </ol>
                    </li>
                  </ul>
                </li>
                <li>Webブラウザ上で，ボタンをクリックして，吹き出しの内容を確かめる。</li>
              </ol>
              <p>それでは，ダウンロードした入力XML(photoMap-01.xml)に，実際に少し手を加えて見る。変更後のファイル名を"my-photoMap-01.xml"(<span idref="code-my-photoMap-01"/>参照)とする。
              </p>
              <codeSample caption="入力XMLの変更(my-photoMap-01.xml)" id="code-my-photoMap-01"
><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="photoMap-01.xsl.xml"?>
<photoMap xmlns="urn:myPhoto" xmlns:html="http://www.w3.org/1999/xhtml">
  <initialLoadMap lat="35.659437" long="139.791735" label="U社">
    <description flagIconUrl="images/flag2_blue.png"
    >U社：江東区豊洲</description>
  </initialLoadMap>
  <photo href="http://www.xmlconsortium.org/wg/web2.0/mashups/xslt/photos/uBuild.jpg"
         label="U社"
  >
    <title>U社本社</title>
    <description flagIconUrl="images/flag2_yellow.png">
      <html:div>月島から見たU社</html:div>
      <html:div style="color:brown;">システムインテグレーションはおまかせ</html:div>
    </description>
    <keywords>
      <keyword>システムインテグレータ</keyword>
    </keywords>
    <extrainfo>
      <info type="xbrl-bs1"
            url="http://・・中略・・/xbrl/bs-NUL061-xbrl.xml"
      />
      <info type="jalanHotel"
            url="http://jws.jalan.net/APILite/HotelSearch/V1/"
            key="cyg***********"                           ←ここのIDは各自で設定のこと
             s_area="136202"   name="銀座・晴海・築地"
            icon="images/flag2_green.png"
      />
    </extrainfo>
  </photo>
</photoMap>]]></codeSample>
              <p>ここでの変更のポイントは，</p>
                <ul>
                  <li>初期情報として1社のみを残して，2枚目以降の写真を削除する</li>
                  <li>写真の上のボタンクリック時の旗の色を黄色に変更する</li>
                  <li>黄色い旗をクリックしたときに表示される内容を変更する</li>
                  <li>キーワードを「システムインテグレータ」に変更する</li>
                  <li>ホテル情報を示す旗の色を茶色から緑に変更する</li>
                  <li>財務情報の表示方法を入れ替える。xbrl-bs2→xbrl-bs1</li>
                </ul>
              <div>である。このように変更して，そのXMLをブラウザ(IE6)で開き，「地図表示【1】」をクリックし，黄色い旗をクリックすると，
                <span idref="fig-my-photoMap-01"/>
                のように表示される。変更した入力XMLの内容に従って，ブラウザ上での表示が変更されたこと，そしてグーグルマップ上に出てくる文言が変更されて表示されていることを確認していただきたい。なお，info要素のkey属性の値としては，皆さん自身でじゃらんWebサービスの<url href="https://jws.jalan.net/ws/viw/U08001">アカウント登録</url>をしていただき，得られたAPIキーを設定すること。
              </div>
              <fig caption="my-photoMap-01.xml の表示" id="fig-my-photoMap-01"
                   href="xsltMashupFiles/my-photoMap-01.jpg"/>
              <p>また，じゃらんWebサービスを使って，銀座・晴海・築地地区のエリアコードを指定しているので，地図上では緑の旗の位置にあるホテルの情報があることがわかる。実際に幾つかの緑の旗をクリックしてみると，ホテルの写真が現れるはずである。実はこの例では位置情報の持ち方の単位(測地系)が，じゃらんWebサービス(日本測地系)とグーグルマップ(世界測地系)で異なるために，位置が少しずれているのだが，お分かりだろうか。実際に利用するときには，測地系をあわせることに注意が必要である。
              </p>
              <p>
                入力XML(<span idref="code-my-photoMap-01"/>)において，更にkeyword要素を"コンピュータ"に変更するとか，info要素にて，type属性の値を"xbrl1-bs2"に戻すとかして，異なる表示になることを試してみて頂きたい。
                
                GPS付きカメラや携帯電話を持っている人は，写真をWebサイトに公開して，その写真のURLを入力XML内に設定し，若干のコメント，キーワードを加えて，簡単にマッシュアップできることを試行すると良いだろう。更に興味のある人は，XSLTのソースを見て，様々なチャレンジをしていただきたい。
              </p>
              <p>
                最後に，マッシュアップをする際には，利用するサービスの利用条件を満たすように注意が必要であることを付け加えておく。個人的に利用する場合には問題になることが少ないと思われるが，商用で利用する場合には特によく注意していただきたい。また，サービス提供が突然停止してしまったり，インタフェースが変わることが起こり得ることなどにも気をつける必要がある。上で紹介したWebサービスが使えなくなった場合にはご容赦願いたい。商用で利用する際にはこのような条件も含めて，はっきりとさせておくことが必要であろう。それらを頭に入れながら，まずはマッシュアップを試していただきたい。
              </p>
            </body>
          </subsection>
        </body>
      </section>
    </body>
  </chapter>
  <additionalInfo>
    <pageTopInfo>
<!--
      <a href="http://www.xmlconsortium.org/">
        <img src="http://www.xmlconsortium.org/wg/web2.0/teigensho/XMLconsBanner.jpg"
               title="XMLconsBanner"
               alt="XMLconsBanner"/>
      </a>
-->
      <a href="http://www.xmlconsortium.org/" target="_blank">
        <img src="xml_j_c3.gif" alt="XMLコンソーシアム"/>
      </a>
    </pageTopInfo>
    <metaInfo>
      <meta name="author" content="小林 茂(Shigeru.Kobayashi@unisys.co.jp)" />
      <meta name="description" content="XMLコンソーシアム Web2.0部会による『Web2.0提言書』の一部として執筆したもの"/>
      <meta name="keywords" content=" XMLコンソーシアム, XML, XSLT, RDF, Web2.0, マッシュアップ, WebAPI, REST, Webサービス"/>
      <title>XSLT マッシュアップ：WebサービスをXSLTを利用してマッシュアップする</title>

    </metaInfo>
    <pageBottommInfo>

<hr align="left" size="1" width="25%"/>
<pre>
本頁の著作権：
Copyright (c) XML コンソーシアム 2007 All rights reserved.
Copyright (c) 日本ユニシス株式会社 2007 All rights reserved.
</pre>
      <hr align="left" size="1" width="25%"/>
      <p>
        <a href="http://www.xmlconsortium.org/wg/web2.0/teigensho/">
          「エンタープライズ・システムのためのWeb 2.0」目次に戻る
        </a>
      </p>
    </pageBottommInfo>
  </additionalInfo>
</doc>
