0

由于亚马逊关闭了对 xslt 的支持,我想使用 php5 的 xsl 将它移动到我自己的服务器上。我的输出需要采用文本格式,以便我的 JS 为网页处理它。我的问题是亚马逊的 xml 响应(非常缩写)看起来像这样

    <?xml version="1.0" ?>
    <ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01">
       /............./
    </ItemLookupResponse>

我的问题是,只要我删除 xmlns="http://...",我的 xsl 样式表就可以正常工作。xsl 样式需要什么来绕过或忽略它?我需要的所有节点都在那个外部节点之内。

这是xslt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="CallBack" select="'amzJSONCallback'"/>
<xsl:output method="text"/>

 <xsl:template match="/">
  <xsl:value-of select="$CallBack"/>
  <xsl:text>( { "Item" : </xsl:text><xsl:apply-templates/><xsl:text> } ) </xsl:text>
 </xsl:template>

 <xsl:template match="OperationRequest"></xsl:template>
 <xsl:template match="Request"></xsl:template>

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

 <xsl:template match="Item">
  <xsl:text> {</xsl:text>
  <xsl:text>"title":"</xsl:text><xsl:apply-templates select="ItemAttributes/Title"/><xsl:text>",</xsl:text>
  <xsl:text>"author":"</xsl:text><xsl:apply-templates select="ItemAttributes/Author"/><xsl:text>",</xsl:text>
  <xsl:text>"pubbdate":"</xsl:text><xsl:apply-templates select="ItemAttributes/PublicationDate"/><xsl:text>"</xsl:text>
  <xsl:text>} </xsl:text>
 </xsl:template>
</xsl:stylesheet>
4

2 回答 2

0

看起来 nwellnhof 是正确的。我在测试中使用了错误的命名空间。我所做的只是添加:

<xsl:stylesheet ... xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2011-08-01">

然后元素看起来像

<xsl:template match="aws:ItemLookupResponse">

现在转换工作完美。我不知道为什么我第一次尝试它时它不起作用。

于 2013-09-08T15:50:52.470 回答
0

您可能应该了解 XML 名称空间是如何工作的。简而言之,您必须像这样在 XSL 文件中定义名称空间前缀:

<xsl:stylesheet ... xmlns:awse="http://webservices.amazon.com/AWSECommerceService/2011-08-01">

然后,您必须使用限定名称来匹配和选择该命名空间下的元素:

<xsl:template match="awse:ItemLookupResponse">

(使用 XSLT 2.0,您可以定义默认名称空间。但由于您使用的是 PHP,因此您可能仅限于 XSLT 1.0。)

于 2013-09-01T22:53:42.067 回答