2013-08-01 55 views
1

我有一個xsl:for-each,我想將每2個項目包裝在一個div中。怎麼做?xsl - 每隔一個div包含每個2項目

<xsl:for-each select="$datapath/PackageInfoList/PackageInfo"> 

<!-- lots of html in here --> 

</xsl:for-each> 

所以結果將是:

<div> 
<!-- lots of html in here --> 
<!-- lots of html in here --> 
</div> 
<div> 
<!-- lots of html in here --> 
<!-- lots of html in here --> 
</div> 
+0

您可能要檢查[這個答案](http://stackoverflow.com/a/9908661/2633606)。 – rcgoncalves

回答

6

選擇奇數<PackageInfo>元件,這樣

<xsl:for-each select="$datapath/PackageInfoList/PackageInfo[position() mod 2 = 1]"> 
    <div> 
    <!-- lots of html in here --> 

    <!-- do something with following-sibling::PackageInfo[1] --> 
    </div> 
</xsl:for-each> 

這在位置1,3,5等處理運行的元件手動分別首先執行<PackageInfo>


更地道

<xsl:template match="/"> 
    <xsl:apply-templates select="$datapath/PackageInfoList/PackageInfo" mode="group2" /> 
</xsl:template> 

<xsl:template match="PackageInfo" mode="group2"> 
    <xsl:if test="position() mod 2 = 1"> 
    <div> 
     <xsl:apply-templates select=". | following-sibling::PackageInfo[1]" /> 
    </div> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="PackageInfo"> 
    <!-- lots of html in here --> 
</xsl:template> 

更靈活

<xsl:template match="/"> 
    <xsl:apply-templates select="$datapath/PackageInfoList/PackageInfo" mode="group"> 
    <xsl:with-param name="groupcount" select="2" /> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="PackageInfo" mode="group"> 
    <xsl:param name="groupcount" select="2" /> 

    <xsl:if test="position() mod $groupcount = 1"> 
    <div> 
     <xsl:apply-templates select=". | following-sibling::PackageInfo[position() &lt; $groupcount]" /> 
    </div> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="PackageInfo"> 
    <!-- lots of html in here --> 
</xsl:template> 
+0

你的答案的第一部分是每個奇怪的元素,這不是我想要的。 如何將「更習慣」的答案與for-each相結合? –

+1

@MarkSteggles既然你沒有*說*你想要什麼(即通過提供「當前」和「想要」的輸出樣本),這是我最好的猜測。 - 慣用的解決方案沒有使用'。把它扔出來並使用''。 99%的時間使用''是不對的,儘量避免使用它。 – Tomalak