2015-09-23 58 views
0

我是XSLT新手,需要您的幫助。我必須在XSLT中創建詞表。列和行的數量是動態的。XSLT使用動態行數和列數創建表

這是一個示例XML:

<Movies> 
    <Genre name="Action"> 
    <Movie> 
     <Name>Crash</Name> 
     <Released>2005</Released> 
    </Movie> 
    </Genre> 
    <Genre name="Drama"> 
    <Movie> 
     <Name>The Departed</Name> 
     <Released>2006</Released> 
    </Movie> 
    <Movie> 
     <Name>The Pursuit of Happyness</Name> 
     <Released>2006</Released> 
    </Movie> 
    </Genre> 
    <Genre name="Comedy"> 
    <Movie> 
     <Name>The Bucket List</Name> 
     <Released>2007</Released> 
    </Movie> 
    </Genre> 
</Movies> 

流派元件可以包含任意數量的電影元件。

表應該是這樣的:
Picture

這是XSLT:

<xsl:template match="/"> 
     <w:document> 
      <w:body>  
       <w:tbl> 
        <w:tr> 
         <xsl:for-each select="/Movies/Genre"> 
          <w:tc> 
           <w:p> 
            <w:r> 
             <w:t> 
              <xsl:value-of select="@name"/> 
             </w:t> 
            </w:r> 
           </w:p> 
          </w:tc> 
         </xsl:for-each> 
        </w:tr> 

        <!-- Movies? --> 

       </w:tbl> 
      </w:body> 
     </w:document> 
    </xsl:template> 

列標題是沒有問題的,但我怎麼能寫所期望的影片元素?有沒有辦法用兩個爲每個循環,或者我必須使用apply-templates?感謝您的支持!

+0

請發表您預期的結果**爲代碼**,而不是照片。同時指出是否使用XSLT 1.0或2.0。 –

+0

我正在使用XSLT 1.0。圖片是結果。它是Word/Writer中表格的屏幕截圖。 XML,XSLT和DOCX模板在PHP中處理。 – removr

回答

1

不幸的是我不熟悉的DOCX格式,所以你可能要更正的輸出,但作爲XSLT,下面應該做的伎倆

<xsl:template match="/"> 
    <w:document> 
     <w:body> 
     <w:tbl> 
      <w:tr> 
      <xsl:for-each select="/Movies/Genre"> 
       <w:tc> 
       <w:p> 
        <w:r> 
        <w:t> 
         <xsl:value-of select="@name"/> 
        </w:t> 
        </w:r> 
       </w:p> 
       </w:tc> 
      </xsl:for-each> 
      </w:tr> 

      <!-- Movies? --> 

      <xsl:call-template name="movies-row"> 
      <xsl:with-param name="i" select="1"></xsl:with-param> 
      </xsl:call-template> 

     </w:tbl> 
     </w:body> 
    </w:document> 
    </xsl:template> 

    <xsl:template name="movies-row"> 
    <xsl:param name="i"/> 

     <w:tr> 
     <xsl:for-each select="/Movies/Genre"> 
      <w:tc> 
      <w:p> 
       <w:r> 
       <w:t> 
        <xsl:choose> 
        <xsl:when test="count(Movie) >= $i"> 
         <xsl:value-of select="concat(Movie[$i]/Name, ' (', Movie[$i]/Released, ')')"/> 
        </xsl:when> 
        <xsl:otherwise> 
         <!-- empty cell --> 
        </xsl:otherwise> 
        </xsl:choose> 
       </w:t> 
       </w:r> 
      </w:p> 
      </w:tc> 
     </xsl:for-each> 
     </w:tr> 

    <xsl:if test="/Movies/Genre[count(Movie) > $i]"> 
     <xsl:call-template name="movies-row"> 
     <xsl:with-param name="i" select="$i + 1"/> 
     </xsl:call-template> 
    </xsl:if> 
    </xsl:template> 
+0

這工作完美。非常感謝ideafixxxer! – removr