如何将<xsl:foreach>拆分为多个部分?

Joh*_*ski 3 xml xslt cdata

我有一个元素列表,我想分成3个单独的列表.最终结果将是这样的:

<ul>
    <li>element</li>
    <li>element</li>
</ul>
<ul>
    <li>element</li>
    <li>element</li>
</ul>
<ul>
    <li>element</li>
    <li>element</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我的XSLT是这样的,但它不起作用,因为我无法插入</ul>,并且我无法插入小于sign(<).

<ul>
    <xsl:for-each select="$myroot/item">
        <li></li>

        <xsl:if test="position() mod $maxItemsPerColumn = 0">
            <!-- I want to close my ul, and start a new one here, but it doesn't work! -->
        </xsl:if>
    </xsl:for-each>
</ul>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?提前致谢!

Rob*_*ney 9

你不需要像递归一样做任何奇特的事情.好主,甚至不打算使用CDATA.

你只需要像XSLT一样思考并问:"我想将哪个输入元素转换为输出元素?"

假设每个ul都应该包含N items,你想要将每个第N个输入item从第一个开始转换为ul:

<xsl:variable name="n" select="number(4)"/>

<xsl:template match="/">
  <output>
    <xsl:apply-templates select="/root/item[position() mod $n = 1]"/>
  </output>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

这些item元素中的每一个都成为ul包含该项目及其每个N-1兄弟姐妹的元素:

<xsl:template match="item">
  <ul>
    <xsl:for-each select=". | following-sibling::item[position() &lt; $n]">
      <li>
        <xsl:value-of select="."/>
      </li>
    </xsl:for-each>
  </ul>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

假设输入文档如下:

<root>
  <item>1</item>
  <item>2</item>
  <item>3</item>
  <item>4</item>
  <item>5</item>
  <item>6</item>
  <item>7</item>
  <item>8</item>
  <item>9</item>
</root>
Run Code Online (Sandbox Code Playgroud)

...你得到这个输出,如果$n设置为4:

<output>
  <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
  </ul>
  <ul>
    <li>5</li>
    <li>6</li>
    <li>7</li>
    <li>8</li>
  </ul>
  <ul>
    <li>9</li>
  </ul>
</output>
Run Code Online (Sandbox Code Playgroud)