子要素を変換

広告

前のページでルートノードに対する変換ルールを記述しました。今度はルートノード内に含まれる要素に対する変換ルールを記述していきます。

オペレーションとしてItemSearchのリクエストを送信した場合、次のようなXMLデータが取得できます。

<?xml version="1.0" ?> 
<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2009-07-01">
  ...
</ItemSearchResponse>

一番外側のルート要素としては「ItemSearchResponse」要素となっています。今回はこの「ItemSearchResponse」要素に対する変換ルールーを記述します。

ルートノード内の子要素に対する変換ルールの記述方法は次のようになります。

<xsl:template match="/">
  ...
  <xsl:apply-templates select="パターン"/>
  ...
</xsl:template>

<xsl:template match="パターン">
  <!-- 変換ルールを記述 -->
</xsl:template>

まずルートノードの変換ルールを記述する部分に次のような記述を行います。

<xsl:apply-templates select="パターン"/>

パターンはルートノードの時は単に「/」と記述しましたが、要素の場合は対象の要素の名前を使って「aws:要素名」で記述します。

次に対象の子要素をどのように変換するのかをルートノードの場合と同じように次のように記述を行います。

<xsl:template match="パターン">
  <!-- 変換ルールを記述 -->
</xsl:template>

パターンは先ほどと同じように対象の要素の名前を使って「aws:要素名」で記述します。

今回変換ルールを記述したい子要素は「ItemSearchResponse」要素ですので次のように記述します。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2009-07-01"
  version="1.0">
<xsl:output method="html" encoding="UTF-8"/>

<xsl:template match="/">

  <xsl:apply-templates select="aws:ItemSearchResponse"/>

</xsl:template>

<xsl:template match="aws:ItemSearchResponse">
  <!-- 変換ルールを記述 -->
</xsl:template>

</xsl:stylesheet>

ルートノードに対する変換ルールの中で<xsl:apply-template>を記述した位置に処理が来たら、「select」に指定したパターンに一致する別のテンプレートルールを探して処理を行います。今回の場合で言えば「aws:ItemSearchResponse」に位置するテンプレートを探して処理した結果を<xsl:apply-template>を記述した位置に埋め込みます。

例として次のようなXSLTスタイルシートを作成してみます。

ecs3-1.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2009-07-01"
  version="1.0">
<xsl:output method="html" encoding="UTF-8"/>

<xsl:template match="/">
  <html lang="ja">
  <head>
  <title>XSLサンプル</title>
  </head>
  <body>

  <p>サンプル</p>

  <xsl:apply-templates select="aws:ItemSearchResponse"/>

  </body>
  </html>
</xsl:template>

<xsl:template match="aws:ItemSearchResponse">
  <p>
  ItemSearchResponse要素
  </p>
</xsl:template>

</xsl:stylesheet>

流れとしてはルートノードを対象に変換処理を行い、その変換の途中で<xsl:apply-template>が現れた場合には、新しいテンプレートルールを探して変換を行い、その結果を埋め込むと言う処理になります。

サンプル

では実際に試してみます。上記の「ecs3-1.xsl」をXSLTスタイルシートとして設置し、その後で次のようなリクエストを送信します。(「Style」パラメータにはXSLTスタイルシートを設置したURLを指定して下さい)。

http://xml-jp.amznxslt.com/onca/xml?
Service=AWSECommerceService
&AWSAccessKeyId=[AccessKey]
&Version=2009-07-01
&ResponseGroup=Small
&Operation=ItemSearch
&SearchIndex=Books
&Keywords=Java
&ContentType=text/html
&Style=http://www.example.com/ecs3-1.xsl

結果として取得したXMLデータがXSLTスタイルシートによって変換され次のように出力されます。

子要素を変換

取得したHTMLデータは次のようになっています。

<html xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2009-07-01" lang="ja">
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>XSLサンプル</title>
   </head>
   <body>
      <p>サンプル</p>
      <p>

         ItemSearchResponse要素
         
      </p>
   </body>
</html>

これでルートノードに含まれる一番外側の要素を変換することができました。

( Written by Tatsuo Ikura )