Amazon WebサービスをXSLTでJSONに変換

AmazonWebサービスXSLTJSONに変換してブラウザ直結させるのは結構使える技だと思ってたけど、なにせ今までXSLスタイルシートを書く機会がほとんどなかったため、XML中の文字列に引用符が含まれるときのエスケープ(置換)方法がどうしていいのかわからなかった。そのため、ときどき本文に「'」や「"」が含まれる場合に、ブラウザがJSONとして解釈できずにエラーになっていた。

これじゃちょっと問題が多いので、何とかならないか調べたところ、一応組み込みのreplace関数というのがあるらしい。ただしこれはXSLT 2.0からみたいだったので、なんだAmazonXSLTじゃできないんじゃん?と思ってたのだけど、このエントリ見てちゃんと違うやり方があるのに気がついた。慣れればさらっと出て来るんだろうな。

http://hail2u.net/blog/coding/labs-hail2-net-amazon-tree.html
http://labs.hail2u.net/amazon/tree/
http://labs.hail2u.net/amazon/tree/similaritylookup.xsl

<xsl:template name="replace">
  <xsl:param name="str"/>
  <xsl:param name="from">&#39;</xsl:param>
  <xsl:param name="to">\&#39;</xsl:param>
  <xsl:choose>
    <xsl:when test="contains($str, $from)">
      <xsl:value-of select="substring-before($str, $from)"/>
      <xsl:value-of select="$to"/>

      <xsl:call-template name="replace">
        <xsl:with-param name="str" select="substring-after($str, $from)"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$str"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

ちなみに個人的には固定変数によるJSONデータの引き渡しよりはパラメータ指定のコールバック関数に渡すやり方(JSONP)の方が好きなので、あとでそっちで実装してみる。/aws:ItemSearchResponse/aws:OperationRequest/aws:Argumentsからコールバック関数名はパラメータとしてとれるはずなので。