モジュラスを使用できないため、問題は XSLT で 4 つのグループをラップすることです。
反対に。:) あなたが欲しいのは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() > $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
-- を使用して、グループ内に含まれる要素の数を保持していることに注意してください。これにより利便性が向上します。将来、たとえば、ごとに 3 つの要素が必要な場合は、単純にその変更を行います。<li>
<div>
<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>