2012-11-30 49 views
2

我是XSL的新手,試圖爲我做一些有點複雜的事情,並尋求幫助。使用XSL構建HTML表格

這裏的XML是什麼樣子的例子:

<foo> 
    <customers> 
    <customer> 
     <title>Ms</title> 
     <name> 
     <firstName>Jane</firstName> 
     <lastName>Customer</lastName> 
     </name> 
     <reservations> 
     <reseration> 
      <reservationNumber>123</reservationNumber> 
      <reservationDate>2013-02-15</reservationDate> 
      <table>12</table 
     </reservation> 
     <reseration> 
      <reservationNumber>456</reservationNumber> 
      <reservationDate>2013-03-24</reservationDate> 
      <table>09</table 
     </reservation> 
     <reseration> 
      <reservationNumber>789</reservationNumber> 
      <reservationDate>2013-05-02</reservationDate> 
      <table>22</table 
     </reservation> 
     </reservations> 
    </customer> 
    <customer> 
     <title>Dr</title> 
     <name> 
     <firstName>John</firstName> 
     <lastName>Smith</lastName> 
     </name> 
     <reservations> 
     <reseration> 
      <reservationNumber>ABC</reservationNumber> 
      <reservationDate>2013-02-15</reservationDate> 
      <table>05</table 
     </reservation> 
     <reseration> 
      <reservationNumber>DEF</reservationNumber> 
      <reservationDate>2013-03-24</reservationDate> 
      <table>10</table 
     </reservation> 
     <reseration> 
      <reservationNumber>GHI</reservationNumber> 
      <reservationDate>2013-05-02</reservationDate> 
      <table>16</table 
     </reservation> 
     </reservations> 
    </customer> 
    </customers> 
</foo> 

我想結果表看起來像這樣:

Title  Name    Reservation  Date   Table 
-----  ----    -----------  ----   ----- 
Ms  Jane Customer  123    2013-02-15  12 
          456    2013-03-24  09 
          789    2013-05-02  22 
Dr  John Smith  ABC    2013-02-15  05 
          DEF    2013-03-24  10 
          GHI    2013-05-02  16 

我知道如何建立一個表這種方式使用XSL for-each構建每一行。關於這一點棘手的是如何構建遞歸,將第一個子元素的預留細節(預留,日期和表格)拉到與第一行父元素相同的行中。然後只剩下剩餘行中剩餘子元素的預留詳細信息。

所以這個:

Title  Name    Reservation  Date   Table 
-----  ----    -----------  ----   ----- 
Ms  Jane Customer  123    2013-02-15  12 
          456    2013-03-24  09 
          789    2013-05-02  22 

不是這個:

Title  Name    Reservation  Date   Table 
-----  ----    -----------  ----   ----- 
Ms  Jane Customer  
          123    2013-02-15  12 
          456    2013-03-24  09 
          789    2013-05-02  22 

做了很多的搜索,並沒有看到任何東西完全是這樣。

UPDATE

這就是我能去上班

<xsl:for-each select="customers/customer"> 
    <xsl:for-each select="./reservations/reservation"> 
    <xsl:choose> 
     <xsl:when test="position() = 1"> 
     <tr> 
      <td><xsl:value-of select="../../title"/></td> 
      <td><xsl:value-of select="reservationNumber"/></td> 
     </tr> 
     </xsl:when> 
     .... 

回答

2

最簡單的方法可能是比賽上reservation元素。

對於每個reservation,可以使用<xsl:when test="node[position() > 1]">來測試每個是否是其父項的第一個子項。如果是,您可以使用parent軸來獲取customer的詳細信息;否則,你可以填充空白。

+0

這就是我能去上班(簡稱例子)。感謝這兩個迴應。 \t \t​​的 ​​的 \t' –

+0

大!很高興你有它的工作。 –

0

如果您想使標題和名稱跨越多行,您可以使用count()函數找出預留的數量。

由於第一個預留位於同一個表格行,因此您需要對第一個預留與其餘預定進行不同處理。

下面的片段展示的想法:

<xsl:template match="customer"> 
    <xsl:variable name="res" select="reservations/reservation"/> 
    <tr> 
     <td rowspan="{count($res)}"><xsl:value-of select="title"/></td> 
     <td rowspan="{count($res)}"><xsl:apply-templates select="name"/></td> 
     <!-- the first reservation goes to the same row --> 
     <xsl:apply-templates select="$res[1]"/> 
    </tr> 
    <!-- the rest of the reservations go to their own rows --> 
    <xsl:for-each select="$res[position() &gt; 1]"> 
     <tr> 
     <xsl:apply-templates select="."/> 
     </tr> 
    </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="name"> 
    <xsl:value-of select="concat(firstName, ' ', lastName)"/> 
    </xsl:template> 

    <xsl:template match="reservation"> 
    <td><xsl:value-of select="reservationNumber"/></td> 
    <td><xsl:value-of select="reservationDate"/></td> 
    <td><xsl:value-of select="table"/></td> 
    </xsl:template>