0

我有以下 XSLT 代码,它显示来自本地 XML 文件(标题、演员、运行时等)的电影信息和来自外部亚马逊 xml 的 Amazon API 产品信息(产品标题和图片)。

<xsl:variable name="moviesXML" select="document('movies.xml')"/>
<xsl:variable name="inputRoot" select="/"/>

<xsl:param name="movieID"/>

<xsl:template match="/">
    <html>
        <head>
            <title>Movie details</title>
        </head>
        <body>
            <xsl:for-each select="$moviesXML/movies/movie[@movieID=$movieID]">
                <xsl:value-of select="title" />
                <xsl:value-of select="actors" />
                ...
                <xsl:apply-templates select="$inputRoot/aws:ItemLookupResponse/aws:Items/aws:Item/aws:ItemAttributes/aws:Title"/>
                <xsl:apply-templates select="$inputRoot/aws:ItemLookupResponse/aws:Items/aws:Item/aws:MediumImage/aws:URL"/>
            </xsl:for-each>
        </body>
    </html>
</xsl:template>

<xsl:template match="aws:Title">
    <xsl:value-of select="." />
    <br/>
</xsl:template>

<xsl:template match="aws:URL">
    <img src="{.}"/>
    <br/>
</xsl:template>

因此,根据从上一页传递的movieID,上面的代码显示了该特定电影的所有相关信息。我使用 Amazon API 为每部电影显示两种产品(DVD 和蓝光产品)。

我遇到的问题是我的 XSLT 一次显示两个亚马逊产品标题,然后同时显示两个图片。但我想要的是显示亚马逊产品标题+图片(DVD),然后是另一个亚马逊产品标题+图片(蓝光)。

这是我得到的输出:

坏的

这就是我想要实现的目标:

好的

4

1 回答 1

1

你得到你想要的。这些线

<xsl:apply-templates select="$inputRoot/aws:ItemLookupResponse/aws:Items/aws:Item/aws:ItemAttributes/aws:Title"/>
<xsl:apply-templates select="$inputRoot/aws:ItemLookupResponse/aws:Items/aws:Item/aws:MediumImage/aws:URL"/>

将首先应用一批模板,然后是另一批。

您需要将标题和图像放在一个模板中,如下所示:

<xsl:template match="aws:Item">
    <xsl:value-of select="aws:ItemAttributes/aws:Title" />
    <br/>

    <img src="{aws:MediumImage/aws:URL}"/>
    <br/>
</xsl:template>

然后像这样使用它

<xsl:apply-templates select="$inputRoot/aws:ItemLookupResponse/aws:Items/aws:Item"/>

顺便说一句,这是我第一次在这里看到 XSLT 代码中“太多”的模板分解。更多时候你会看到相反的问题。

于 2013-04-09T15:13:16.583 回答