如何将 xml 数据转换为行和列?
How to transform xml data into rows and columns?
这是我的输入 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输出table:
行 = 2
1 | 3 | 5 | 7
2 | 4 | 6 | 8
行 = 3
1 | 4 | 7
2 | 5 | 8
3 | 6 |
XSLT-1.0: ??
如何将上面的 xml 转换为上面 html 中的结构。行数未预定义,将作为参数提供。
给定节点列表
<xsl:variable name="nodes" select="/data/node"/>
您需要为前 n 个节点中的每一个创建一行
<xsl:for-each select="$nodes[position() <= $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。
这样试试:
<xsl:variable name="rows" select="2" />
<xsl:template match="/data">
<table>
<xsl:for-each select="node[position() <= $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>
这是我的输入 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输出table:
行 = 2
1 | 3 | 5 | 7
2 | 4 | 6 | 8
行 = 3
1 | 4 | 7
2 | 5 | 8
3 | 6 |
XSLT-1.0: ??
如何将上面的 xml 转换为上面 html 中的结构。行数未预定义,将作为参数提供。
给定节点列表
<xsl:variable name="nodes" select="/data/node"/>
您需要为前 n 个节点中的每一个创建一行
<xsl:for-each select="$nodes[position() <= $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。
这样试试:
<xsl:variable name="rows" select="2" />
<xsl:template match="/data">
<table>
<xsl:for-each select="node[position() <= $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>