2016-05-02 1 views
0

ノードシーケンスをM×Nテーブルとしてレンダリングしようとしましたが、ここですでに質問されている他の質問に従って管理しました。ノードシーケンスをM×Nとして内部ノードシーケンス用テーブル

ここでは、サブシーケンスを内側のM x 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> 

は、どのように私はそれだけで、対応する項目のサブ項目を取得することができますか?あなたのsubitemテンプレートに

brgds、 バート

答えて

0

小さな変更が行います。試してみてください:

<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