2012-11-27 35 views
1

表試想一下下面的XML使用XSL從XML創建XHTML - 與預定義的寬度

<?xml version="1.0" encoding="ISO-8859-1"?> 

<bookstore> 

<book> 
    <title lang="eng">Harry Potter</title> 
    <price>29.99</price> 
</book> 
<book> 
    <title lang="eng">Learning XML</title> 
    <price>39.95</price> 
</book> 
<book> 
    <title lang="eng">A book</title> 
    <price>39.95</price> 
</book> 
<book> 
    <title lang="eng">Another Book</title> 
    <price>39.95</price> 
</book> 

</bookstore> 

我需要創建一個顯示在XHTML中,每行只有2本圖書XML文件的XSL樣式表。 XML文件中的書籍數量可隨時更改,因此XSL需要考慮到這一點。我認爲這樣做的一個解決方案就是將數據放入表格中,但是我無法將自己的大腦思考成一種有效的創建方式。可能的想法是執行模2檢查或將總書籍除以2,但仍然無法總結如何編寫這些文件來創建有效的代碼。以下是我的一個解決方案,可以在一個長列中一個接一個地顯示所有書籍。

<?xml version="1.0" encoding="ISO-8859-1"?> 

<xsl:template match="/"> 
    <html> 
     <head> 
     <link rel="stylesheet" type="text/css" href="css/theStyle.css" /> 
     </head> 
     <body onload="parent.alertsize(document.body.scrollHeight);"> 

      <div> 

       <!-- <p><xsl:value-of select="count(//book)"/></p>--> 
       <xsl:for-each select="/bookstore/book"> 


         <h4><xsl:value-of select='title' /></h4> 
         <p><xsl:value-of select='price' /></p> 


        <!--<xsl:if test="postion() mod 2 = 0"> 
         <p>a mod 0</p> 
        </xsl:if>--> 
       </xsl:for-each> 

      </div> 

     </body> 
    </html> 
</xsl:template> 

任何提示/指針/溶液不勝感激。 (不一定要求表作爲解決方案,我只是覺得這可能是一個選項)

回答

0

解決方案

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <html> 
     <head> 
     <link rel="stylesheet" type="text/css" href="css/theStyle.css" /> 
     </head> 
     <body onload="parent.alertsize(document.body.scrollHeight);"> 
     <div> 
      <xsl:apply-templates select="bookstore/book"/> 
     </div> 
     </body> 
    </html> 
    </xsl:template> 
    <xsl:template match="book[position() mod 2 = 1]"> 
    <h4> 
     <xsl:value-of select='title' /> 
    </h4> 
    <p> 
     <p>a mod 1</p> 
     <xsl:value-of select='price' /> 
    </p> 
    </xsl:template> 
    <xsl:template match="book[position() mod 2 = 0]"> 
    <h4> 
     <xsl:value-of select='title' /> 
    </h4> 
    <p> 
     <p>a mod 0</p> 
     <xsl:value-of select='price' /> 
    </p> 
    </xsl:template> 

</xsl:stylesheet> 

結果

<html> 
    <head> 
    <META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <link rel="stylesheet" type="text/css" href="css/theStyle.css"> 
    </head> 
    <body onload="parent.alertsize(document.body.scrollHeight);"> 
    <div> 
     <h4>Harry Potter</h4> 
     <p> 
     <p>a mod 1</p>29.99</p> 
     <h4>Learning XML</h4> 
     <p> 
     <p>a mod 0</p>39.95</p> 
     <h4>A book</h4> 
     <p> 
     <p>a mod 1</p>39.95</p> 
     <h4>Another Book</h4> 
     <p> 
     <p>a mod 0</p>39.95</p> 
    </div> 
    </body> 
</html> 

說明

你可以使用循環和xsl:if以達到相同的結果,但模板功能更強大。您可以將它們視爲僅適用於匹配參數的函數。它絕對有助於減少代碼的縮進,並將單獨和偶數書籍的模板彼此分開。

+0

感謝您對此的幫助,我覺得好像我理解模板好一點,現在想知道這是否也是一種解決方案。 但是,我的結果代碼將被放置在iframe中,我需要能夠使用XSL來顯示每行只有2個元素。 我知道iframe的寬度,所以作爲解決方案我可以添加一些間距嗎?或者任何人都可以想到另一種解決方案?你仍然可以看到你的結果代碼,它們會一個接一個地顯示出來。 – neilfoxholes

+0

@neilfoxholes那麼,我認爲你的問題是關於XSL轉換,目標HTML是一個完全不同的問題。看看有關兩列布局的教程之一(http://mirificampress.com/show.php?id=106並不錯),看看它是否適合你。 –

+0

感謝您的幫助!我現在解決了我的問題。 – neilfoxholes