xml - 无法使用 XSLT 文件设置 Amazon AWS 生成的 XML 文件的样式

标签 xml xslt amazon-web-services

很抱歉不得不问类似的问题((Steffen Opel)非常友善地帮助了我。我无法获取 xslt 表来设置调用 Amazon Web Services (AWS) 生成的 xml 文件的样式。我有很多 AWS通过更改架构日期(从 2005-10-05 50 到 2011-08-01)或将 Enpoint 更新为“ecs.amazonaws.co.uk/onca/xml”来纠正所有调用。

对 AWS 的调用是:

RESTstringtemp = "http://ecs.amazonaws.co.uk/onca/xml?Service=AWSECommerceService&AssociateTag=xxxx&SubscriptionId=zzzz&Operation=BrowseNodeLookup&BrowseNodeLookup.1.BrowseNodeId=676410011&BrowseNodeLookup.2.BrowseNodeId=676398011&BrowseNodeLookup.1.ResponseGroup=TopSellers,NewReleases&BrowseNodeLookup.2.ResponseGroup=TopSellers,NewReleases&Style=http://www.wiiuser.co.uk/topsellersnewrel.xslt"

可以看出,这会生成一个 xml 文件并使用“topsellersnewrel.xslt”对其进行样式设置。 xml文件生成成功,没有指定样式。但是,当指定样式时,生成的文件保持不变。就好像 xslt 文件不存在一样。不过可以在这里找到 http://www.wiiuser.co.uk/topsellersnewrel.xslt .文件已生成

在不存在“&Style=...”的情况下生成的 xml 文件的缩短版本是:

<?xml version="1.0" encoding="UTF-8"?>
<BrowseNodeLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05">
  <OperationRequest>
    <HTTPHeaders>
      <Header Name="UserAgent" Value="Jakarta Commons-HttpClient/3.0.1">
      </Header>
        </HTTPHeaders>
    <RequestId>1ABRF6WY8WSF5FM0EACQ</RequestId>
    <Arguments>
    <Argument Name="BrowseNodeLookup.2.ResponseGroup" Value="TopSellers,NewReleases"></Argument>
    <Argument Name="AssociateTag" Value="xxxx"></Argument>
    <Argument Name="Service" Value="AWSECommerceService"></Argument>
    <Argument Name="SubscriptionId" Value="zzzz"></Argument>
    <Argument Name="Signature" Value="f5mKeNVNEB5/sGIomPd/pXRC5Yfs5aCMchR5qgsvw0c="></Argument>
    <Argument Name="BrowseNodeLookup.1.BrowseNodeId" Value="676410011"></Argument>
    <Argument Name="BrowseNodeLookup.2.BrowseNodeId" Value="676398011"></Argument>
    <Argument Name="Operation" Value="BrowseNodeLookup"></Argument>
    <Argument Name="Timestamp" Value="2012-03-02T12:41:51Z"></Argument>
    <Argument Name="BrowseNodeLookup.1.ResponseGroup" Value="TopSellers,NewReleases"></Argument>
    </Arguments>
    <RequestProcessingTime>0.069159984588623</RequestProcessingTime>
</OperationRequest>
<BrowseNodes>
    <Request>
    <IsValid>True</IsValid>
    <BrowseNodeLookupRequest>
        <BrowseNodeId>676410011</BrowseNodeId>
        <ResponseGroup>TopSellers</ResponseGroup>
        <ResponseGroup>NewReleases</ResponseGroup>
    </BrowseNodeLookupRequest>
    </Request>
    <BrowseNode>
    <BrowseNodeId>676410011</BrowseNodeId>
    <Name>Games</Name>
    <TopSellers>
        <TopSeller>
            <ASIN>B006ZN5WJ0</ASIN>
            <Title>Mario Party 9 (Wii)</Title>
        </TopSeller>
    </TopSellers>
    <NewReleases>
        <NewRelease>
            <ASIN>B0073POVPK</ASIN>
            <Title>Pokepark 2: Wonders Beyond (Wii)</Title>
        </NewRelease>
    </NewReleases>
    </BrowseNode>
</BrowseNodes>
<BrowseNodes>
    <Request>
    <IsValid>True</IsValid>
    <BrowseNodeLookupRequest>
        <BrowseNodeId>676398011</BrowseNodeId>
        <ResponseGroup>TopSellers</ResponseGroup>
        <ResponseGroup>NewReleases</ResponseGroup>
    </BrowseNodeLookupRequest>
    </Request>
    <BrowseNode>
    <BrowseNodeId>676398011</BrowseNodeId>
    <Name>Accessories</Name>
    <TopSellers>
        <TopSeller>
            <ASIN>B006O8ODD2</ASIN>
            <Title>Skylanders Spyro's Adventure: Triple Character Pack - Double Trouble, Whirlwind and Drill Sergeant (Wii/PS3/Xbox 360/PC)</Title>
        </TopSeller>
    </TopSellers>
    <NewReleases>
        <NewRelease>
            <ASIN>B005CT3J66</ASIN>
            <Title>Level Up Stealth Media Storage Tower (PS3/Xbox 360/Wii)</Title>
        </NewRelease>
    </NewReleases>
    </BrowseNode>
</BrowseNodes>
</BrowseNodeLookupResponse> 

xslt 文件是:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2005-10-05">
<xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent="yes"/>
<xsl:template match="/">
    <xml>
    <root>
        <xsl:apply-templates select="aws:BrowseNodeLookupResponse/aws:BrowseNodes" />
    </root>
    </xml>
</xsl:template>


<xsl:template match="aws:TopSeller">
        <xsl:variable name="browsenode" select="../../aws:BrowseNodeId" />
        <xsl:variable name="topsellerASIN" select="aws:ASIN" />
        <xsl:variable name="topsellerTitle" select="aws:Title" />
        <BrowseNodeId>
            <browsenode>
                <xsl:value-of select="$browsenode" />
            </browsenode>
        </BrowseNodeId>
        <TopSeller>
            <tsAsin>
                <xsl:value-of select="$topsellerASIN" />
            </tsAsin>
            <tstitle>
                <xsl:value-of select="$topsellerTitle" />
            </tstitle>
        </TopSeller>
</xsl:template> 


<xsl:template match="aws:NewRelease">
        <xsl:variable name="browsenode" select="../../aws:BrowseNodeId" />
        <xsl:variable name="newreleaseASIN" select="aws:ASIN" />
        <xsl:variable name="newreleaseTitle" select="aws:Title" />
        <BrowseNodeId>
            <browsenode>
                <xsl:value-of select="$browsenode" />
            </browsenode>
        </BrowseNodeId>
        <NewRelease>
            <nrAsin>
                <xsl:value-of select="$newreleaseASIN" />
            </nrAsin>
            <nrtitle>
                <xsl:value-of select="$newreleaseTitle" />
            </nrtitle>
        </NewRelease>
</xsl:template> 

我已经整理了所有其他文件,但这个文件打败了我!

请有人帮忙。

最佳答案

我能够在提供的 XML 文档上成功运行提供的转换。

转换的结果是:

<?xml version="1.0" encoding="iso-8859-1"?>
<xml xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2005-10-05">
   <root>

            True

                676410011
                TopSellers
                NewReleases



            676410011
            Games

                <BrowseNodeId>
         <browsenode>676410011</browsenode>
      </BrowseNodeId>
      <TopSeller>
         <tsAsin>B006ZN5WJ0</tsAsin>
         <tstitle>Mario Party 9 (Wii)</tstitle>
      </TopSeller>



      <BrowseNodeId>
         <browsenode>676410011</browsenode>
      </BrowseNodeId>
      <NewRelease>
         <nrAsin>B0073POVPK</nrAsin>
         <nrtitle>Pokepark 2: Wonders Beyond (Wii)</nrtitle>
      </NewRelease>




            True

                676398011
                TopSellers
                NewReleases



            676398011
            Accessories

                <BrowseNodeId>
         <browsenode>676398011</browsenode>
      </BrowseNodeId>
      <TopSeller>
         <tsAsin>B006O8ODD2</tsAsin>
         <tstitle>Skylanders Spyro's Adventure: Triple Character Pack - Double Trouble, Whirlwind and Drill Sergeant (Wii/PS3/Xbox 360/PC)</tstitle>
      </TopSeller>



      <BrowseNodeId>
         <browsenode>676398011</browsenode>
      </BrowseNodeId>
      <NewRelease>
         <nrAsin>B005CT3J66</nrAsin>
         <nrtitle>Level Up Stealth Media Storage Tower (PS3/Xbox 360/Wii)</nrtitle>
      </NewRelease>



   </root>
</xml>

此外,XSLT 样式表可通过 http://www.wiiuser.co.uk/topsellersnewrel.xslt 访问。

因此,此问题与 XSLT 无关。很可能是其他 Url QS 参数值导致了该问题,或者可能是与安全相关的问题。

请联系亚马逊支持以获得更多帮助。

更新:OP在评论中要求纠正他的转变......

导致不需要的输出的问题出现在以下代码中:

    <xsl:apply-templates select="aws:BrowseNodeLookupResponse/aws:BrowseNodes" />

这会将模板应用于任何 aws:BrowseNodeLookupResponse/aws:BrowseNodes元素,但提供的 XSLT 代码没有与此类元素匹配的模板。

在这种情况下,XSLT 处理器选择执行元素的 XSLT 内置模板,这只是发出 <xsl:apply-templates>这会导致其所有子项都被处理。递归地重复此过程,直到遇到文本节点子节点 - 在这种情况下,选择文本节点的内置模板来执行,其操作是输出文本节点。

这就是 aws:BrowseNodeLookupResponse/aws:BrowseNodes 的所有文本节点后代的方式(不是为其提供匹配模板的元素的后代)被输出

解决方案:只需添加以下模板:

<xsl:template match="text()"/>

现在产生的输出是:

<?xml version="1.0" encoding="iso-8859-1"?>
<xml xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2005-10-05">
   <root>
      <BrowseNodeId>
         <browsenode>676410011</browsenode>
      </BrowseNodeId>
      <TopSeller>
         <tsAsin>B006ZN5WJ0</tsAsin>
         <tstitle>Mario Party 9 (Wii)</tstitle>
      </TopSeller>
      <BrowseNodeId>
         <browsenode>676410011</browsenode>
      </BrowseNodeId>
      <NewRelease>
         <nrAsin>B0073POVPK</nrAsin>
         <nrtitle>Pokepark 2: Wonders Beyond (Wii)</nrtitle>
      </NewRelease>
      <BrowseNodeId>
         <browsenode>676398011</browsenode>
      </BrowseNodeId>
      <TopSeller>
         <tsAsin>B006O8ODD2</tsAsin>
         <tstitle>Skylanders Spyro's Adventure: Triple Character Pack - Double Trouble, Whirlwind and Drill Sergeant (Wii/PS3/Xbox 360/PC)</tstitle>
      </TopSeller>
      <BrowseNodeId>
         <browsenode>676398011</browsenode>
      </BrowseNodeId>
      <NewRelease>
         <nrAsin>B005CT3J66</nrAsin>
         <nrtitle>Level Up Stealth Media Storage Tower (PS3/Xbox 360/Wii)</nrtitle>
      </NewRelease>
   </root>
</xml>

关于xml - 无法使用 XSLT 文件设置 Amazon AWS 生成的 XML 文件的样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9534124/

相关文章:

amazon-web-services - 运行 Amplify Auth Update 后运行 Amplify Push 时出错

java - 替换 JAR 文件中的 XML 文件

java - 如何防止 JAXB 在编码时绑定(bind) @XmlRootElement 的父类(super class)方法?

java - 使用 XSL 进行 XML 转换

xml - xpath 通过索引获取元素

javascript - 如何使用一个 XSLT 文件中的变量到另一个 XSLT 文件

amazon-web-services - 使用基于负载的实例时,Amazon OpsWorks 自定义说明书不会更新

javascript - xml 文件中的导航问题

android - 与 xml 图形布局相比,模拟器上的按钮位置不正确

amazon-web-services - AWS Lambda 解压缩 gzip 文件而不将文件保存在本地