问题是在 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
-- 来保持应该包含在组中的元素的数量。这提供了便利。以后,如果您需要<li>
每个 3 个元素<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>