因为Amazon关闭了对xslt的支持,所以我想用php5的xsl把它移到我自己的服务器上。我的输出需要是文本格式,以便我的JS将其处理为网页。我的问题是Amazon的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>发布于 2013-09-02 06:53:42
您可能应该了解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-08 23:50:52
看起来nwellnhof是正确的。我在测试中使用了错误的名称空间。我所做的就是添加:
<xsl:stylesheet ... xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2011-08-01">那么元素看起来就像
<xsl:template match="aws:ItemLookupResponse">现在,转换可以完美地工作。我不知道为什么我第一次尝试的时候它不起作用。
https://stackoverflow.com/questions/18562334
复制相似问题