2011-12-17 7 views
3

XSLTで次の形式をレンダリングする必要があります。私は<xsl:for-eachの5つの要素(Text1、Text2 ... Text5)を持つループを持ち、3つの要素ごとにulタグをラップする必要があります。何か提案してください?XSLTでループする - <xsl:for-each

<ul> 
    <li>Text1</li> 
    <li>Text2</li> 
    <li>Text3</li> 
</uL> 
<ul> 
    <li>Text4</li> 
    <li>Text5</li> 
</uL> 

答えて

4

いい質問、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="thing[position() mod 3 = 1]"> 
    <ul> 
    <xsl:apply-templates mode="inGrpoup" select= 
    ".|following-sibling::*[not(position() > 2)]"/> 
    </ul> 
</xsl:template> 

<xsl:template match="thing" mode="inGrpoup"> 
    <li><xsl:value-of select="."/></li> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 

は、次のXML文書に適用:

<things> 
    <thing>1</thing> 
    <thing>2</thing> 
    <thing>3</thing> 
    <thing>4</thing> 
    <thing>5</thing> 
    <thing>6</thing> 
    <thing>7</thing> 
    <thing>8</thing> 
</things> 

(連続した3のグループのもの)指名手配、正しい結果を生成します。

<ul> 
    <li>1</li> 
    <li>2</li> 
    <li>3</li> 
</ul> 
<ul> 
    <li>4</li> 
    <li>5</li> 
    <li>6</li> 
</ul> 
<ul> 
    <li>7</li> 
    <li>8</li> 
</ul> 

説明三つthing要素群の第一thingに一致

  1. テンプレートパターン。一度決定thing要素(初期開始thingの処理とは異なる方法で)のグループを処理するモードを使用

2

興味深い質問です。私は少しのモジュラー算術を使用して、<xsl:key>を使って3つの各グループを識別する以下の1つのソリューションを概説しました。

入力文書:

<TestDocument> 
    <Element>Alpha</Element> 
    <Element>Bravo</Element> 
    <Element>Charlie</Element> 
    <Element>Delta</Element> 
    <Element>Echo</Element> 
    <Element>Foxtrot</Element> 
    <Element>Golf</Element> 
    <Element>Hotel</Element> 
</TestDocument> 

スタイルシート:

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

    <!-- Declare a key to identify each group of 3 elements --> 
    <xsl:key name="positionKey" match="/TestDocument/Element" use="floor((position() - 2) div 3)"/> 
    <xsl:template match="/TestDocument"> 
     <html> 
      <!-- Iterate over the first element in each group --> 
      <xsl:for-each select="Element[(position() - 1) mod 3 = 0]"> 
       <ul> 
        <!-- Grab all elements from this group --> 
        <xsl:apply-templates select="key('positionKey', position()-1)"/> 
       </ul> 
      </xsl:for-each> 
     </html> 
    </xsl:template> 

    <xsl:template match="Element"> 
     <li><xsl:value-of select="."/></li> 
    </xsl:template> 
</xsl:stylesheet> 

結果:

<html> 
    <ul> 
     <li>Alpha</li> 
     <li>Bravo</li> 
     <li>Charlie</li> 
    </ul> 
    <ul> 
     <li>Delta</li> 
     <li>Echo</li> 
     <li>Foxtrot</li> 
    </ul> 
    <ul> 
     <li>Golf</li> 
     <li>Hotel</li> 
    </ul> 
</html>