2011-03-22 39 views
1

的XML:XSLT和表:設置成一排的細胞數量

<data> 
    <table id="returns"> 
     <each> 
      <name>1 year</name> 
      <value>17.01062531999216</value> 
     </each> 
     <each> 
      <name>3 years</name> 
      <value>18.01062531999216</value> 
     </each> 
     <each> 
      <name>5 years</name> 
      <value>21.01062531999216</value> 
     </each> 
     <each> 
      <name>Since inception</name> 
      <value>12.01062531999216</value> 
     </each> 
    </table> 
</data> 

我一直在努力的XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <tr> 
      <xsl:for-each select="data/table[@id='returns']/each"> 
       <td><xsl:value-of select="name"/></td> 
       <td><xsl:value-of select="value"/></td> 
       <xsl:if test="//each[position() mod 2 = 0]"> 
        <xsl:text disable-output-escaping="yes"></tr><tr></xsl:text> 
       </xsl:if> 
      </xsl:for-each> 
     </tr> 
    </xsl:template> 
</xsl:stylesheet> 

結果我想:

<table> 
    <tr> 
     <td>1 year</td> 
     <td>17.01062531999216</td> 
     <td>3 years</td> 
     <td>18.01062531999216</td> 
    </tr> 
    <tr> 
     <td>5 years</td> 
     <td>21.01062531999216</td> 
     <td>Since inception</td> 
     <td>12.01062531999216</td> 
    </tr> 
</table> 

我很尷尬地說,我一直在爲此工作多久。只要說暴力,嘗試一切,多次技術都不起作用。

+0

好問題,+1。看到我的答案是一個完整的,簡短的和簡單的解決方案,這是迄今爲止唯一正確的解決方案。 :) – 2011-03-22 13:25:10

回答

0

每行渲染2個單元格。

選擇從第一個開始的每個第二個節點。對於這些,渲染一個包含self和下面的單元格的行。如果最後一行不包含2 each元素,則用空單元格完成該行。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output indent="yes"/> 

    <xsl:template match="table"> 
     <table> 
      <xsl:apply-templates select="each[1 = position() mod 2]"/> 
     </table> 
    </xsl:template> 


    <xsl:template match="each"> 
     <tr> 
      <xsl:for-each select=". | following-sibling::each[1]" > 
       <td><xsl:value-of select="name"/></td> 
       <td><xsl:value-of select="value"/></td> 
      </xsl:for-each> 
      <xsl:if test="not(following-sibling::each)"> 
       <td/> 
       <td/> 
      </xsl:if> 
     </tr> 
    </xsl:template> 

</xsl:stylesheet> 
+0

該解決方案的主要問題是它不會產生想要的結果。 – 2011-03-22 13:23:17

+0

這對我有用。 – dylanmac 2011-03-22 20:42:24

1

較短和正確溶液

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="table"> 
    <table> 
    <xsl:apply-templates/> 
    </table> 
</xsl:template> 
<xsl:template match="each[position() mod 2 = 1]"> 
    <tr> 
    <xsl:apply-templates select="(.|following-sibling::each[1])/*"/> 
    </tr> 
</xsl:template> 

<xsl:template match="name|value"> 
    <td><xsl:apply-templates/></td> 
</xsl:template> 

<xsl:template match="each[position() mod 2 = 0]"/> 
</xsl:stylesheet> 

當這個變換所提供的XML文檔應用:

<data> 
    <table id="returns"> 
     <each> 
      <name>1 year</name> 
      <value>17.01062531999216</value> 
     </each> 
     <each> 
      <name>3 years</name> 
      <value>18.01062531999216</value> 
     </each> 
     <each> 
      <name>5 years</name> 
      <value>21.01062531999216</value> 
     </each> 
     <each> 
      <name>Since inception</name> 
      <value>12.01062531999216</value> 
     </each> 
    </table> 
</data> 

有用,正確的結果生產

<table> 
    <tr> 
     <td>1 year</td> 
     <td>17.01062531999216</td> 
     <td>3 years</td> 
     <td>18.01062531999216</td> 
    </tr> 
    <tr> 
     <td>5 years</td> 
     <td>21.01062531999216</td> 
     <td>Since inception</td> 
     <td>12.01062531999216</td> 
    </tr> 
</table> 
+0

嗯,這不適合我。一些背景:我正在做客戶端XSL,我正在使用jquery插件將轉換寫入html頁面。不確定是否重要,但此解決方案不輸出任何內容。 – dylanmac 2011-03-22 20:41:59

+0

+1經典拉風格的答案。 – 2011-03-22 23:12:17

+0

@ user184051:這有效。做測試。它沒有邏輯,其他人做,而這不是。 – 2011-03-22 23:16:15