所以我有一个显示员工档案的模板.像这样:
<div class="row">
<li></li>
<li></li>
<li></li>
<li></li>
</div>
<div class="row">
<li></li>
<li></li>
<li></li>
<li></li>
</div>
Run Code Online (Sandbox Code Playgroud)
在我的XSLT For-each循环中,我需要一种方法来围绕每组4个列表项包装"div class = row".我可以测试计数以查看我在哪个元素,但问题是在XSLT中包装4个组,因为你不能使用模数.
问题是在XSLT中包装4个组,因为你不能使用模数.
Au逆转.:)你想要的是什么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>
Run Code Online (Sandbox Code Playgroud)
...适用于提议的源XML:
<ul>
<li/>
<li/>
<li/>
<li/>
<li/>
<li/>
<li/>
<li/>
</ul>
Run Code Online (Sandbox Code Playgroud)
...产生了想要的结果(虽然它可能没有通过有效HTML的嗅探测试):
<ul>
<div class="row">
<li />
<li />
<li />
<li />
</div>
<div class="row">
<li />
<li />
<li />
<li />
</div>
</ul>
Run Code Online (Sandbox Code Playgroud)
注意使用变量 - $vNumOfElems来保持组中应包含的元素数量.这提供了便利.在路上,你是否需要,比方说,<li>每个3 元素<div>,只需做出改变:
<xsl:variable name="vNumOfElems" select="3" />
Run Code Online (Sandbox Code Playgroud)
...再次提供正确的结果:
<ul>
<div class="row">
<li />
<li />
<li />
</div>
<div class="row">
<li />
<li />
<li />
</div>
<div class="row">
<li />
<li />
</div>
</ul>
Run Code Online (Sandbox Code Playgroud)