如何将xml数据转换为行和列?

时间:2015-02-17 10:06:20

标签: xml xslt xslt-1.0

这是我的输入XML:

<data>
    <node>1</node>
    <node>2</node>
    <node>3</node>
    <node>4</node>
    <node>5</node>
    <node>6</node>
    <node>7</node>
    <node>8</node>
</data>

必需的HTML输出表:

row = 2

1 | 3 | 5 | 7
2 | 4 | 6 | 8

row = 3

1 | 4 | 7
2 | 5 | 8
3 | 6 | 

XSLT-1.0:??

如何将上述xml转换为html中的上述结构。行数未预定义,将作为参数提供。

2 个答案:

答案 0 :(得分:2)

以这种方式尝试:

<xsl:variable name="rows" select="2" />

<xsl:template match="/data">
    <table>
            <xsl:for-each select="node[position() &lt;= $rows]">
                <xsl:variable name="i" select="position() mod $rows"/>
                <tr>
                    <xsl:for-each select="../node[position() mod $rows = $i]">
                        <td><xsl:value-of select="."/></td>
                    </xsl:for-each>
                </tr>
            </xsl:for-each>
    </table>
</xsl:template>

答案 1 :(得分:0)

给出节点列表

<xsl:variable name="nodes" select="/data/node"/>

您需要为每个 n 节点

创建一行
<xsl:for-each select="$nodes[position() &lt;= $numRows]">
  <xsl:variable name="rowNum" select="position()"/>
  <tr>

然后在行内,可以通过模运算选择单元格 - 第一行是节点1,n + 1,2n + 1等,第二行是2,n + 2,...

    <xsl:for-each select="$nodes[position() mod $numRows = $rowNum]">

编辑:正如评论中指出的那样,这对最后一行不起作用 - 您需要将rowNum的定义更改为模numRows

  <xsl:variable name="rowNum" select="position() mod $numRows"/>

因为最后一行的模数值是0而不是n。