好的,
我结合了@Dimitre Novatchev 来自这篇文章的答案的想法和来自[XSLT] 的@Tomalak 的想法:将节点序列渲染为 M x N 表帖子。我真的很喜欢@Tomalak 的$perRow
变量解决方案和<xsl:template name="filler">
处理空单元格的模板。
从@Dimitre Novatchev 的回答中得到的想法我坚持$trStartPos
。然后我计算$lowerBoundry
并$upperBoundry
用于累积应该连续出现的所有元素。可能有一种更优雅的方法来做这个计算 - 如果你想出一个,请告诉我,我真的很感激!
XSLT 转换
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- Select only required elements -->
<xsl:variable name="tableData"
select="/nums/A | /nums/B | /nums/C | /nums/D | /nums/E "/>
<xsl:variable name="perRow" select="2"/>
<xsl:template match="/">
<table border="1">
<tbody>
<xsl:apply-templates
select="$tableData[position() mod $perRow = 1]" mode="tr"/>
</tbody>
</table>
</xsl:template>
<xsl:template match="nums/*" mode="tr">
<xsl:variable name="trStartPos" select="position()" />
<xsl:variable name="upperBoundry" select="$trStartPos * $perRow" />
<xsl:variable name="lowerBoundry" select="$upperBoundry - $perRow" />
<tr>
<xsl:variable name="tdsData"
select="$tableData[(position() > $lowerBoundry) and (position() <= $upperBoundry)]" />
<xsl:apply-templates select="$tdsData" mode="td"/>
<!-- fill up the last row - @Tomalak's solution -->
<xsl:if test="count($tdsData) < $perRow">
<xsl:call-template name="filler">
<xsl:with-param name="rest" select="$perRow - count($tdsData)" />
</xsl:call-template>
</xsl:if>
</tr>
</xsl:template>
<!-- Templates for specific elements could be easily added with appropriate info to
be displayed depending on the element. This one is general just to display
elements' name and value -->
<xsl:template match="nums/*" mode="td">
<td>
El. name: <xsl:value-of select="local-name()"/> -
El. value: <xsl:value-of select="."/>
</td>
</xsl:template>
<!-- @Tomalak solution (please read beginning of this answer for reference) -->
<xsl:template name="filler">
<xsl:param name="rest" select="0" />
<xsl:if test="$rest">
<td> </td>
<xsl:call-template name="filler">
<xsl:with-param name="rest" select="$rest - 1" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
应用于以下 XML
<nums>
<A>A-01</A>
<num>02</num>
<num>03</num>
<num>04</num>
<B>B-05</B>
<num>06</num>
<num>07</num>
<C>C-08</C>
<num>09</num>
<D>D-10</D>
<num>11</num>
<num>12</num>
<num>13</num>
<E>E-14</E>
<num>15</num>
</nums>
导致以下输出
<table border="1">
<tbody>
<tr>
<td>
El. name: A -
El. value: A-01
</td>
<td>
El. name: B -
El. value: B-05
</td>
</tr>
<tr>
<td>
El. name: C -
El. value: C-08
</td>
<td>
El. name: D -
El. value: D-10
</td>
</tr>
<tr>
<td>
El. name: E -
El. value: E-14
</td>
<td> </td>
</tr>
</tbody>
</table>