0

所以我有一个显示员工档案的模板。像这样:

<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=row”包装在每组 4 个列表项周围的方法。我可以测试计数以查看我在哪个元素上,但问题是在 XSLT 中包装 4 组,因为您不能使用模数。

4

1 回答 1

6

问题是在 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() &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-- 来保持应该包含在组中的元素的数量。这提供了便利。以后,如果您需要<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>
于 2013-04-09T18:54:11.883 回答