さらに子要素を変換

広告

前のページでルートノード内の子要素を変換するルールを記述する方法を確認しました。ここではさらに子要素の中に含まれる要素に対する変換ルールを記述する方法を確認します。

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

<?xml version="1.0" ?> 
<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2009-07-01">
  <OperationRequest>
  </OperationRequest>
  <Items>
    <Request>
      ....
    </Request>
    <TotalResults>30</TotalResults>
    <TotalPages>3</TotalPages>
    <Item>
      ....
    </Item>
    <Item>
      ....
    </Item>
    <Item>
      ....
    </Item>
    <Item>
      ....
    </Item>
    <Item>
      ....
    </Item>
    <Item>
      ....
    </Item>
    <Item>
      ....
    </Item>
    <Item>
      ....
    </Item>
    <Item>
      ....
    </Item>
    <Item>
      ....
    </Item>
  </Items>
</ItemSearchResponse>

一番外側のルート要素としては「ItemSearchResponse」要素となっています。その中に「OperationRequest」要素と「Items」要素が含まれます。また「Items」要素の中には「Request」要素や「Item」要素が含まれます。

では「Item」要素に対する変換ルールを記述してみます。

<?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:apply-templates select="aws:Items"/>
</xsl:template>

<xsl:template match="aws:Items">
  <xsl:apply-templates select="aws:Item"/>
</xsl:template>

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

</xsl:stylesheet>

今回の場合はルートノードの中の「ItemSearchResponse」要素に対する変換ルールを記述します。そのルールの中で「ItemSearchResponse」要素の中に含まれる「Items」要素に対する変換ルールを記述します。さらにそのルールの中で「Items」要素の中に含まれる「Item」要素に対する変換ルールを記述します。

このようにどれだけ深い階層にある要素であっても変換ルールを記述することが可能になります。

サンプル

では実際に試してみます。まず次のようなXSLTスタイルシートを用意します。

ecs4-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"/>
  <p>[/ルートノード]</p>

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

<xsl:template match="aws:ItemSearchResponse">
  <p>[ItemSearchResponse要素]</p>
  <xsl:apply-templates select="aws:Items"/>
  <p>[/ItemSearchResponse要素]</p>
</xsl:template>

<xsl:template match="aws:Items">
  <p>[Items要素]</p>
  <p>
  <xsl:apply-templates select="aws:Item"/>
  </p>
  <p>[/Items要素]</p>
</xsl:template>

<xsl:template match="aws:Item">
  [Item要素]
</xsl:template>

</xsl:stylesheet>

次のようなリクエストを送信します。(「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/ecs4-1.xsl

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

子要素を変換

「Item」要素が10回表示されています。これは変換元のXMLデータの中に「Item」要素が10個含まれているためで、「Item」要素が見つかるたびに変換用テンプレートが呼び出されるためです。

深い階層の要素を直接指定する

先ほどの例では「Item」要素に対する変換ルールを記述するために、ルートノードから順番に要素に対する変換ルールを記述していきました。このような記述方法とは別に、深い階層にある要素に対する変換ルールを次のように記述することもできます。

<?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/aws:Items/aws:Item"/>

</xsl:template>

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

</xsl:stylesheet>

この場合はルートノードの中に含まれる「ItemSearchResponse」要素の子要素の「Items」要素の子要素の「Item」要素に対するテンプレートルールを呼び出しています。そして「ItemSearchResponse」要素の子要素の「Items」要素の子要素の「Item」要素に対する変換ルールを記述しています。

このように孫要素にあたる要素に対して直接変換を行うことが可能です。

サンプル

では実際に試してみます。まず次のようなXSLTスタイルシートを用意します。

ecs4-2.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>
  <p>
  <xsl:apply-templates select="aws:ItemSearchResponse/aws:Items/aws:Item"/>
  </p>
  <p>[/ルートノード]</p>

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

<xsl:template match="aws:ItemSearchResponse/aws:Items/aws:Item">
  [Item要素]
</xsl:template>

</xsl:stylesheet>

次のようなリクエストを送信します。(「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/ecs4-2.xsl

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

子要素を変換

( Written by Tatsuo Ikura )