2016-05-02 31 views
0

我嘗試將節點序列渲染爲M×N表,並根據此處已經提到的其他問題管理它。將節點序列渲染爲內部節點序列的M×N表

現在我嘗試呈現一個子序列作爲內部M×N表。

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <item id="1"> 
     <subitem>1.1</subitem> 
     <subitem>1.2</subitem> 
     <subitem>1.3</subitem> 
     <subitem>1.4</subitem> 
    </item> 
    <item id="2"> 
     <subitem>2.1</subitem> 
     <subitem>2.2</subitem> 
     <subitem>2.3</subitem> 
     <subitem>2.4</subitem> 
     <subitem>2.5</subitem> 
    </item> 
    <item id="3"> 
     <subitem>3.1</subitem> 
     <subitem>3.2</subitem> 
     <subitem>3.3</subitem> 
     <subitem>3.4</subitem> 
    </item> 
    <item id="4"> 
     <subitem>4.1</subitem> 
     <subitem>4.2</subitem> 
     <subitem>4.3</subitem> 
    </item> 
</root> 

和相應的XSL:

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

    <xsl:key name="items-by-row" match="root/item" 
      use="floor(count(preceding-sibling::item) div 2) + 1"/> 

    <xsl:key name="subitems-by-row" match="root/item/subitem" 
      use="floor(count(preceding-sibling::subitem) div 2) + 1"/> 

    <xsl:template match="subitem" mode="cell"> 
      <subitem> 
       <xsl:value-of select="current()" /> 
      </subitem> 
    </xsl:template> 

    <xsl:template match="subitem" mode="row"> 
     <subitem-row> 
      <xsl:apply-templates select="key('subitems-by-row', position())" mode="cell"/> 
      <xsl:variable name="span" select="2 - count(key('subitems-by-row', position()))"/> 
     </subitem-row> 
    </xsl:template> 

    <xsl:template match="item" mode="cell"> 
     <td> 
      <item> 
       <xsl:value-of select="current()/@id" /> 
      </item> 
      <xsl:apply-templates select="./subitem[position() mod 2 = 1]" mode="row"/>    
     </td> 
    </xsl:template> 

    <xsl:template match="item" mode="row"> 
     <tr> 
      <xsl:apply-templates select="key('items-by-row', position())" mode="cell"/> 
      <xsl:variable name="span" select="2 - count(key('items-by-row', position()))"/> 
     </tr> 
    </xsl:template> 

    <xsl:template match="/"> 
     <html> 
      <body> 
       <table> 
        <xsl:apply-templates select="//item[position() mod 2 = 1]" mode="row"/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 

</xsl:stylesheet> 

導致以下的輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<html> 
    <body> 
     <table> 
      <tr> 
       <td> 
        <item>1</item> 
        <subitem-row> 
         <subitem>1.1</subitem> 
         <subitem>1.2</subitem> 
         <subitem>2.1</subitem> 
         <subitem>2.2</subitem> 
         <subitem>3.1</subitem> 
         <subitem>3.2</subitem> 
         <subitem>4.1</subitem> 
         <subitem>4.2</subitem> 
        </subitem-row> 
        <subitem-row> 
         <subitem>1.3</subitem> 
         <subitem>1.4</subitem> 
         <subitem>2.3</subitem> 
         <subitem>2.4</subitem> 
         <subitem>3.3</subitem> 
         <subitem>3.4</subitem> 
         <subitem>4.3</subitem> 
        </subitem-row> 
       </td> 
       <td> 
        <item>2</item> 
        <subitem-row> 
         <subitem>1.1</subitem> 
         <subitem>1.2</subitem> 
         <subitem>2.1</subitem> 
         <subitem>2.2</subitem> 
         <subitem>3.1</subitem> 
         <subitem>3.2</subitem> 
         <subitem>4.1</subitem> 
         <subitem>4.2</subitem> 
        </subitem-row> 
        <subitem-row> 
         <subitem>1.3</subitem> 
         <subitem>1.4</subitem> 
         <subitem>2.3</subitem> 
         <subitem>2.4</subitem> 
         <subitem>3.3</subitem> 
         <subitem>3.4</subitem> 
         <subitem>4.3</subitem> 
        </subitem-row> 
        <subitem-row> 
         <subitem>2.5</subitem> 
        </subitem-row> 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <item>3</item> 
        <subitem-row> 
         <subitem>1.1</subitem> 
         <subitem>1.2</subitem> 
         <subitem>2.1</subitem> 
         <subitem>2.2</subitem> 
         <subitem>3.1</subitem> 
         <subitem>3.2</subitem> 
         <subitem>4.1</subitem> 
         <subitem>4.2</subitem> 
        </subitem-row> 
        <subitem-row> 
         <subitem>1.3</subitem> 
         <subitem>1.4</subitem> 
         <subitem>2.3</subitem> 
         <subitem>2.4</subitem> 
         <subitem>3.3</subitem> 
         <subitem>3.4</subitem> 
         <subitem>4.3</subitem> 
        </subitem-row> 
       </td> 
       <td> 
        <item>4</item> 
        <subitem-row> 
         <subitem>1.1</subitem> 
         <subitem>1.2</subitem> 
         <subitem>2.1</subitem> 
         <subitem>2.2</subitem> 
         <subitem>3.1</subitem> 
         <subitem>3.2</subitem> 
         <subitem>4.1</subitem> 
         <subitem>4.2</subitem> 
        </subitem-row> 
        <subitem-row> 
         <subitem>1.3</subitem> 
         <subitem>1.4</subitem> 
         <subitem>2.3</subitem> 
         <subitem>2.4</subitem> 
         <subitem>3.3</subitem> 
         <subitem>3.4</subitem> 
         <subitem>4.3</subitem> 
        </subitem-row> 
       </td> 
      </tr> 
     </table> 
    </body> 
</html> 

我怎樣才能使它只得到相應項目的子項目?

brgds, 伯特

回答

0

一個小小的改變你的subitem模板就行了。嘗試:

<xsl:template match="subitem" mode="row"> 
    <xsl:variable name="item" select=".." /> 
    <subitem-row> 
     <xsl:apply-templates 
       select="key('subitems-by-row', position())[../@id = $item/@id]" mode="cell"/> 
     <xsl:variable name="span" select="2 - count(key('subitems-by-row', position()))"/> 
    </subitem-row> 
</xsl:template 

用下面的(希望預期)輸出:

<html> 
    <body> 
    <table> 
     <tr> 
     <td> 
      <item>1</item> 
      <subitem-row> 
      <subitem>1.1</subitem> 
      <subitem>1.2</subitem> 
      </subitem-row> 
      <subitem-row> 
      <subitem>1.3</subitem> 
      <subitem>1.4</subitem> 
      </subitem-row> 
     </td> 
     <td> 
      <item>2</item> 
      <subitem-row> 
      <subitem>2.1</subitem> 
      <subitem>2.2</subitem> 
      </subitem-row> 
      <subitem-row> 
      <subitem>2.3</subitem> 
      <subitem>2.4</subitem> 
      </subitem-row> 
      <subitem-row> 
      <subitem>2.5</subitem> 
      </subitem-row> 
     </td> 
     </tr> 
     <tr> 
     <td> 
      <item>3</item> 
      <subitem-row> 
      <subitem>3.1</subitem> 
      <subitem>3.2</subitem> 
      </subitem-row> 
      <subitem-row> 
      <subitem>3.3</subitem> 
      <subitem>3.4</subitem> 
      </subitem-row> 
     </td> 
     <td> 
      <item>4</item> 
      <subitem-row> 
      <subitem>4.1</subitem> 
      <subitem>4.2</subitem> 
      </subitem-row> 
      <subitem-row> 
      <subitem>4.3</subitem> 
      </subitem-row> 
     </td> 
     </tr> 
    </table> 
    </body> 
</html> 
+0

非常感謝!完美的作品! – Bert