Php 将XSLT样式表应用于Amazon产品广告API XML输出

Php 将XSLT样式表应用于Amazon产品广告API XML输出,php,xml,api,xslt,amazon,Php,Xml,Api,Xslt,Amazon,我试图将XSLT样式表应用于AmazonAPI xml输出,并在页面上显示电影标题 这是我的XSLT文件(amazon.xsl): *aws_signed_request.php* function aws_signed_request($region, $params, $public_key, $private_key, $associate_tag=NULL, $version='2011-08-01') { /* Parameters: $regi

我试图将XSLT样式表应用于AmazonAPI xml输出,并在页面上显示电影标题

这是我的XSLT文件(amazon.xsl):

*aws_signed_request.php*

function aws_signed_request($region, $params, $public_key, $private_key, $associate_tag=NULL, $version='2011-08-01')
{    
    /*
    Parameters:
        $region - the Amazon(r) region (ca,com,co.uk,de,fr,co.jp)
        $params - an array of parameters, eg. array("Operation"=>"ItemLookup",
                        "ItemId"=>"B000X9FLKM", "ResponseGroup"=>"Small")
        $public_key - your "Access Key ID"
        $private_key - your "Secret Access Key"
        $version (optional)
    */

    // some paramters
    $method = 'GET';
    $host = 'webservices.amazon.'.$region;
    $uri = '/onca/xml';

    // additional parameters
    $params['Service'] = 'AWSECommerceService';
    $params['AWSAccessKeyId'] = $public_key;
    // GMT timestamp
    $params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
    // API version
    $params['Version'] = $version;
    if ($associate_tag !== NULL) {
        $params['AssociateTag'] = $associate_tag;
    }

    // sort the parameters
    ksort($params);

    // create the canonicalized query
    $canonicalized_query = array();
    foreach ($params as $param=>$value)
    {
        $param = str_replace('%7E', '~', rawurlencode($param));
        $value = str_replace('%7E', '~', rawurlencode($value));
        $canonicalized_query[] = $param.'='.$value;
    }
    $canonicalized_query = implode('&', $canonicalized_query);

    // create the string to sign
    $string_to_sign = $method."\n".$host."\n".$uri."\n".$canonicalized_query;

    // calculate HMAC with SHA256 and base64-encoding
    $signature = base64_encode(hash_hmac('sha256', $string_to_sign, $private_key, TRUE));

    // encode the signature for the request
    $signature = str_replace('%7E', '~', rawurlencode($signature));

    // create request
    $request = 'http://'.$host.$uri.'?'.$canonicalized_query.'&Signature='.$signature;

    return $request;
}

我知道这需要很多代码,但是PHP中的一切都非常好,我确实在页面上显示了一个电影标题。我只想将我的XSLT样式表也应用到它。我对PHP非常陌生,不知道如何正确使用它。

您已经在
amazon.PHP
中的第6行和第7行创建了处理器并导入了样式表,但是您仍然需要使用


要从评论中回答您的问题,以下是如何从该输入生成HTML页面:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2011-08-01"
         exclude-result-prefixes="aws">
    <xsl:output method="html" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="/">
      <html>
        <head>
          <title></title>
        </head>
        <body>
          <xsl:apply-templates />
        </body>
      </html>
    </xsl:template>

  <xsl:template match="aws:Title">
    <h1>
      <xsl:text>Movie Title</xsl:text>
    </h1>
    <xsl:value-of select="." />    
  </xsl:template>
  <xsl:template match="text()" />
</xsl:stylesheet>

电影名称
在样例输入上运行时,将生成:

<html>
  <head>
    <META http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title></title>
  </head>
  <body>
    <h1>Movie Title</h1>
          The Dark Knight Rises (Blu-ray/DVD Combo+UltraViolet Digital Copy)
        </body>
</html>
<h1>Movie Title</h1>
      The Dark Knight Rises (Blu-ray/DVD Combo+UltraViolet Digital Copy)

电影名称
黑暗骑士崛起(蓝光/DVD组合+紫外线数码拷贝)
如果您只想生成一个剪下的HTML,以添加到正在显示的较大页面中,您可以使用以下方法:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2011-08-01"
         exclude-result-prefixes="aws">
  <xsl:output method="html" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="aws:Title">
    <div>
      <h1>
        <xsl:text>Movie Title</xsl:text>
      </h1>
      <xsl:value-of select="." />
    </div>
  </xsl:template>
  <xsl:template match="text()" />
</xsl:stylesheet>

电影名称
产生:

<html>
  <head>
    <META http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title></title>
  </head>
  <body>
    <h1>Movie Title</h1>
          The Dark Knight Rises (Blu-ray/DVD Combo+UltraViolet Digital Copy)
        </body>
</html>
<h1>Movie Title</h1>
      The Dark Knight Rises (Blu-ray/DVD Combo+UltraViolet Digital Copy)
电影标题
黑暗骑士崛起(蓝光/DVD组合+紫外线数码拷贝)

谢谢你的回复,克里斯。我已经使用了您的解决方案,但现在页面根本不显示任何内容。我已经更新了上面的amazon.php代码。所以如果你能看一看,指出我犯的一个错误。我对php非常陌生。谢谢如果要转换XML并在浏览器中显示它,需要将其转换为HTML。浏览器不知道如何处理
(而且
xml
也不是合法的元素名称)。感谢您的回复,JLRishe。但是我用什么来代替和呢?我只想进入“ItemLookupResponse/Items/Item/ItemAttributes/Title”,然后对“Title”元素应用一些样式。在这种特殊情况下,我将如何做?我使用了您提供的第二种解决方案,JLRishe。我在php页面上得到以下两个警告:1)“警告:simplexml加载字符串():实体:第1行:解析器错误:第35行myservername/amazon.php中文档末尾的额外内容警告:simplexml加载字符串():“2”警告:第35行myservername/amazon.php中的simplexml加载字符串():^无法解析响应。”我确实得到了“电影标题”和页面上显示的实际标题,但我也得到了这些警告。有什么想法吗?谢谢你的帮助。这可能是因为结果没有一个根元素。我认为没有必要在结果中使用
simplexml\u load\u string()
,但如果您愿意,我认为我刚才所做的修改,将内容包装在
div
中,应该可以修复该警告。JLRishe,警告已完全消失,但是现在页面是完全空白的,根本不显示任何内容。它是否与Chris之前提供的“transformToXML”解决方案有关?我已经用他的解决方案更新了我的amazon.php,所以可能缺少什么?再次感谢你的帮助!在这一行之后:
$transform=$proc->transformToXML($doc)请尝试
echo$transform。我不认为那条线后面的东西是必要的。是的!现在一切都很好。你不知道我尝试让这个AmazonAPI正常工作了多久。JLRiche,非常感谢您的帮助!
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2011-08-01"
         exclude-result-prefixes="aws">
  <xsl:output method="html" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="aws:Title">
    <div>
      <h1>
        <xsl:text>Movie Title</xsl:text>
      </h1>
      <xsl:value-of select="." />
    </div>
  </xsl:template>
  <xsl:template match="text()" />
</xsl:stylesheet>
<h1>Movie Title</h1>
      The Dark Knight Rises (Blu-ray/DVD Combo+UltraViolet Digital Copy)