2012-11-05 33 views
1

我一直在嘗試處理上週我詢問的問題的變體。XSL用於Xml到兩行和多列的錶轉換

XSL for Xml to table transformation

我必須輸出每個部分的第一個和最後一個頁碼到一個兩行的表格中。

我如何兩行的表與Muenchian分組的方法

的XSLT 1.0解決方案是什麼,我需要整合困惑。我有一個解決方案,但我需要兩行。

任何意見或指導將非常感激。

輸入:

<root> 
    <page number="1" section="Arsenal">Arsenal</page> 
    <page number="2" section="Arsenal">Arsenal</page> 
    <page number="3" section="Arsenal">Arsenal</page> 
    <page number="4" section="Arsenal">Arsenal</page> 
    <page number="5" section="Arsenal">Arsenal</page> 
    <page number="6" section="Arsenal">Arsenal</page> 
    <page number="7" section="Chelsea">Chelsea</page> 
    <page number="8" section="Chelsea">Chelsea</page> 
    <page number="9" section="Chelsea">Chelsea</page> 
    <page number="10" section="Chelsea">Chelsea</page> 
    <page number="11" section="Chelsea">Chelsea</page> 
    <page number="12" section="Chelsea">Chelsea</page> 
    <page number="13" section="ManUnited">ManUnited</page> 
    <page number="14" section="ManUnited">ManUnited</page> 
    <page number="15" section="ManUnited">ManUnited</page> 
    <page number="16" section="ManUnited">ManUnited</page> 
    <page number="17" section="ManUnited">ManUnited</page> 
    <page number="18" section="ManUnited">ManUnited</page> 
    <page number="19" section="ManCity">ManCity</page> 
    <page number="20" section="ManCity">ManCity</page> 
    <page number="21" section="ManCity">ManCity</page> 
    <page number="22" section="ManCity">ManCity</page> 
    <page number="23" section="ManCity">ManCity</page> 
    <page number="24" section="ManCity">ManCity</page> 
</root> 

輸出:

<table> 
<tr> 
<td>Arsenal</td> 
<td></td> 
<td>Chelsea</td> 
<td></td> 
<td>ManU</td> 
<td></td> 
<td>ManCity</td> 
<td></td> 
</tr> 
<tr> 
<td>1</td> 
<td>6</td> 
<td>7</td> 
<td>12</td> 
<td>13</td> 
<td>18</td> 
<td>19</td> 
<td>24</td> 
</tr> 
</table> 

這是我目前的XSLT邏輯。

<table> 
<tr> 
<xsl:apply-templates select="page[generate-id() = generate-id(key('kSection', @section))]"/> 
</tr>      
</table> 
</xsl:template> 
<xsl:template match="page"> 
<td> 
<xsl:value-of select="@section"/> 
</td> 
<td> 
<xsl:value-of select="@number"/> 
</td> 
<td> 
<xsl:value-of select="key('kSection', @section)[last()]/@number"/> 
</td> 
</xsl:template> 
</xsl:stylesheet> 

問候JJ。

回答

1

用途:

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

    <xsl:key name="k" match="page" use="@section"/> 

    <xsl:template match="/root"> 
    <table> 
     <tr> 
     <xsl:apply-templates select="page[generate-id() = generate-id(key('k', @section))]"/> 
     </tr> 
     <tr> 
     <xsl:apply-templates select="page[generate-id() = generate-id(key('k', @section))]" mode="page"/> 
     </tr> 
    </table> 
    </xsl:template> 

    <xsl:template match="page"> 
    <td> 
     <xsl:value-of select="."/> 
    </td> 
    <td></td> 
    </xsl:template> 

    <xsl:template match="page" mode="page"> 
    <td> 
     <xsl:value-of select="@number"/> 
    </td> 
    <td> 
     <xsl:value-of select="key('k', @section)[last()]/@number"/> 
    </td> 
    </xsl:template> 

</xsl:stylesheet> 

輸出:

<table> 
    <tr> 
    <td>Arsenal</td> 
    <td /> 
    <td>Chelsea</td> 
    <td /> 
    <td>ManUnited</td> 
    <td /> 
    <td>ManCity</td> 
    <td /> 
    </tr> 
    <tr> 
    <td>1</td> 
    <td>6</td> 
    <td>7</td> 
    <td>12</td> 
    <td>13</td> 
    <td>18</td> 
    <td>19</td> 
    <td>24</td> 
    </tr> 
</table> 
+0

完成後,我接受了最有幫助的答案... –

1

首先你需要組section明智然後拿到第一和最後一個節點在for-each

Group by `section` 
    for-each `section` 
    if position =1 or position = last 
     print it 

下面是一個XSL 1.0分組實例參考。希望你能繼續

XSLT select only last version element in rowset

**在XSLT **

<xsl:key name="k" match="page" use="@section"/> 

<xsl:template match="/root"> 
    <table border="1"> 
     <tr> 
      <xsl:for-each select="page[generate-id() = generate-id(key('k', @section))]"> 
       <td colspan="2"> 
        <xsl:value-of select="."/> 
       </td> 
      </xsl:for-each> 
     </tr>  
     <tr> 
     <xsl:for-each select="page[generate-id() = generate-id(key('k', @section))]"> 
      <xsl:variable name="key"> 
       <xsl:value-of select="."/> 
      </xsl:variable> 
      <xsl:for-each select="../page[@section=$key]"> 
       <xsl:if test="(position() = 1) or (position() = last())"> 
        <td> 
         <xsl:value-of select="current()/@number"/> 
        </td> 
       </xsl:if> 
      </xsl:for-each> 
     </xsl:for-each> 
     </tr> 
    </table> 
</xsl:template> 

+0

困惑於我如何在上面顯示的XSLT中使用此解決方案。完全困惑。 –

+0

@ jay.james.666好的,我會詳細解釋,然後你就可以得到它。 – vels4j

+0

感謝您的幫助,非常感謝。 JJ –