我有一个元素列表,我想分成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)
有任何想法吗?提前致谢!
你不需要像递归一样做任何奇特的事情.好主,甚至不打算使用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() < $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)