2013-04-09 92 views
0

我有一個從本地XML文件(標題,演員,運行時間等)和亞馬遜API產品信息 (商品標題與圖片)從外部顯示電影信息下面的XSLT代碼亞馬遜xml。XSLT - 在一排顯示的子元素

<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,上面的代碼顯示了該特定電影的所有相關信息。 我使用亞馬遜API爲每部電影(DVD和BluRay產品)顯示兩種產品。

我的問題是,一次我的XSLT同時顯示亞馬遜的產品標題,然後同時顯示兩個畫面。但我想要的是顯示 Amazon產品標題+圖片(DVD),然後顯示另一個Amazon產品標題+圖片(BluRay)。

這是我得到的輸出:

bad

這是我想達到的目標:

good

回答

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代碼中的「太多」模板分解。更多時候你會看到相反的問題。

+0

這是完美的!感謝您的幫助,哈波。這一切都是你解釋它的方式的完美意義。 – Alex 2013-04-09 15:20:36