XSLT で、属性(アトリビュート)の値を知りたい(Amazon A2S REST の Argument ノード)。

Amazon A2S REST の Argument ノードなんていってもチンプンカンプンだと思う。A2S とは、旧 Amazon Web Services のことで、A2S は Amazon Associates Web Service に 2007年11月 に改称されたために、Amazon Associates の A が 2つ重なるのをとって A2S というらしい。名前の改称自体は結構タイムリーなお知らせではある(笑)。まぁ、中身は変わらない。

この A2S は、REST API で URL にパラメータを載せて Amazon.com を呼び出すと、XML でアマゾンの情報を引き出せるというものだ。前にAmazon アソシエイトで、ウェブサービス (A2S / 旧AWS) を REST で利用する方法 (A2S: Amazon Associates Web Services)という記事を書いたので参考にしてほしい。

で、この A2S を呼び出すには、以下のように URL を組み立てる必要があるのだが、以下のような URL を呼び出す(見やすいように適宜改行をはさんでいるが本来は1行)

https://webservices.amazon.com/onca/xml ?Service=AWSECommerceService &AWSAccessKeyId=152ZP71KPB47XM09CS02 &Operation=ItemLookup &Version=2007-10-29 &AssociateTag=twinklexxx-20 &IdType=ASIN &ContentType=text%252Fhtml &Page=1 &ResponseGroup=ItemAttributes%2CImages%2COffers &ItemId=B000IY04RC &Style=...

戻される XML をみてみると、

<?xml version="1.0" encoding="UTF-8"?>
<OperationRequest>
  <HTTPHeaders>
    <Header Name="UserAgent" Value="Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11">
    </Header>
  </HTTPHeaders>
  <RequestId>
    1RRSHYA741NFJWBP309R
  </RequestId>
  <Arguments>
    <Argument Name="AssociateTag" Value="twinklexxx-20"></Argument>
      <Argument Name="ItemId" Value="B000IY04RC"></Argument>
      <Argument Name="ContentType" Value="text%2Fhtml"></Argument>
      <Argument Name="Service" Value="AWSECommerceService"></Argument>
      <Argument Name="Page" Value="1"></Argument>
      <Argument Name="ResponseGroup" Value="ItemAttributes,Images,Offers"></Argument>
      <Argument Name="Operation" Value="ItemLookup"></Argument>
      <Argument Name="Style"></Argument>
      <Argument Name="IdType" Value="ASIN"></Argument>
      <Argument Name="AWSAccessKeyId" Value="152ZP71KPB47XM09CS02"></Argument>
      <Argument Name="Version" Value="2007-10-29"></Argument>
    </Arguments>
    <RequestProcessingTime>0.0509698390960693</RequestProcessingTime>
  </OperationRequest>
  <Items>
    <Request>
      <IsValid>True</IsValid>
      <ItemLookupRequest>
        <IdType>ASIN</IdType>
        <ItemId>B000IY04RC</ItemId>
...

…と、REST の URL 中に渡されたパラメータはすべて という形式となっているのだ。

この NVP(Name Value Pair)の Value 属性だけを XSLT から取り出すには、どうしたらいいのだろうか?もはやここは A2C の範疇ではなく、XSLT のことなのだが、調べに調べた挙句、どこにも例がなかった。手がかりをひとつひとつ調べていって何度も何度も試した結果、たとえば AssociateTag を XSLT 内で取得するには以下のように記述すればよいことがわかった(見やすいように改行しているけれども、本来は1行)。

普通のノードにある値(つまり、タグ ... で囲まれた値)を取り出すには、でよいのだが、タグの中にある属性値(つまり ... の、abc)はこうはいかない。タグの中の属性値を参照するには、アットマーク「@」を使うのだそうである。しかしここまでまた問題が起きる。上のアマゾン A2S が返してきた XML の Argument タグの中には、属性値が Name="abc" Value="xyz" と、2つあるではないか!

この場合は、Argument[@Name='AssociateTag'] と書いて、まず Name 属性の値が AssciateTag としてたくさんある Argument ノード中から、AssociateTag があるものを絞り込む。

その上で、.../Argument[@Name='AssociateTag']/@Value とすると、Value="xyz" の xyz が取り出せる、という具合である。

いやはや、このサンプルが載っているウェブサイトがどこにも見つからなかったので非常に苦労した。おそらく XML のエキスパートは軽々とこなしているのだろうが・・・まぁ、軽々とこなす人はこのサイトには来ないので、よしとしよう(笑)