SIXTY-SIXとかいうの #2

Amazon E-Commerce Service 4.0は「"」や「'」をそのまま返してくれる(XML的にはまぁOKなんだけど)ので、場合によってはそれらを適切に扱ってやらないとまずかったりします。PerlなりRubyなりでやる場合は大して面倒でもなんでもないのですが、XSLTでどうにかしようとするとなかなか厄介。厄介なのでSIXTY-SIXではこの仕様に由来するバグを放置していたわけですが、どうにかできそうだということを理解したので、ItemSearchをJSONで整形するXSLスタイルシートを修正してみました。

「'」のエスケープは、translate()では出来ないので、

<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>

こんな形の文字列の置換として実装することになります。SIXTY-SIXのケースでは「'」を「\'」にエスケープするだけなので、xsl:paramでデフォルトとしてそれらを指定しておき、呼び出しが書きやすいようにしました。呼び出しは、

<xsl:call-template name="replace">
  <xsl:with-param name="str">
    <xsl:value-of select="aws:ItemAttributes/aws:Title"/>
  </xsl:with-param>
</xsl:call-template>

てな具合。

これでAmazonのXSLTサービスがXMLまんまを返すとかいう寝ぼけたことをしない限り、正常に処理できるようになったような気がする。