2013-04-09 81 views
0

因此,我有一個顯示工作人員配置文件的模板。就像這樣:XSLT For-Each開始一個div,每隔4個元素打開和關閉

<div class="row"> 
    <li></li> 
    <li></li> 
    <li></li> 
    <li></li> 
</div> 
<div class="row"> 
    <li></li> 
    <li></li> 
    <li></li> 
    <li></li> 
</div> 

在我的XSLT for-each循環我需要一種方法來包裝「DIV CLASS =行」周圍的每一個組的4個列表項。我可以測試計數以查看我正在使用的元素,但是由於您無法使用模數,因此問題是使用XSLT包裝4個組。

回答

6

由於無法使用模數,因此問題是將XAPT中的組包裝爲4。

Au contraire。 :)你想要的是mod operator。此外,<xsl:for-each>元素通常不是最可重用的方法;相反,請考慮使用更多可塑模板的解決方案。

當這個XSLT:

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

    <xsl:variable name="vNumOfElems" select="4"/> 

    <xsl:template match="/*"> 
    <ul> 
     <xsl:apply-templates select="li[position() mod $vNumOfElems = 1]"/> 
    </ul> 
    </xsl:template> 

    <xsl:template match="li"> 
    <div class="row"> 
     <xsl:copy-of 
     select=".|following-sibling::li[not(position() &gt; $vNumOfElems - 1)]"/> 
    </div> 
    </xsl:template> 
</xsl:stylesheet> 

......在反對提出的源XML應用:

<ul> 
    <li/> 
    <li/> 
    <li/> 
    <li/> 
    <li/> 
    <li/> 
    <li/> 
    <li/> 
</ul> 

......想要的結果(雖然它可能無法通過產生有效HTML的嗅探測試):

<ul> 
    <div class="row"> 
    <li /> 
    <li /> 
    <li /> 
    <li /> 
    </div> 
    <div class="row"> 
    <li /> 
    <li /> 
    <li /> 
    <li /> 
    </div> 
</ul> 

請注意使用變量 - $vNumOfElems - 保存組中應包含的元素數量。這提供了便利。 下山的路,如果你需要,比方說,每<div> 3個<li>元素,簡單地做出這樣的轉變:

<xsl:variable name="vNumOfElems" select="3" /> 

......再次提供了正確的結果:

<ul> 
    <div class="row"> 
    <li /> 
    <li /> 
    <li /> 
    </div> 
    <div class="row"> 
    <li /> 
    <li /> 
    <li /> 
    </div> 
    <div class="row"> 
    <li /> 
    <li /> 
    </div> 
</ul> 
+0

哇太棒了答案!我真的很感謝你給我講解的一些解釋和時間!這很好! – Eric 2013-04-10 13:10:59

+0

@Eric - 我的榮幸;樂意效勞。 :) – ABach 2013-04-10 13:35:57