XSLT - 连续显示子元素

时间:2013-04-09 15:02:28

标签: xml xslt xpath

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

<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和BluRay产品)显示两种产品。

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

这是我得到的输出:

bad

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

good

1 个答案:

答案 0 :(得分: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代码中的“太多”模板分解。更常见的是你会看到相反的问题。