使用XSLT显示表格记录,即记录显示x列,然后显示新行
我有以下XML:使用XSLT显示表格记录,即记录显示x列,然后显示新行,xslt,Xslt,我有以下XML: <?xml version="1.0" encoding="utf-8" ?> <data> <record> <id>1</id> <name>David</name> <age>40</age> </record> <record> <id>2</id> <name>Tully&l
<?xml version="1.0" encoding="utf-8" ?>
<data>
<record>
<id>1</id>
<name>David</name>
<age>40</age>
</record>
<record>
<id>2</id>
<name>Tully</name>
<age>38</age>
</record>
<record>
<id>3</id>
<name>Solai</name>
<age>32</age>
</record>
<record>
<id>4</id>
<name>Michael</name>
<age>49</age>
</record>
<record>
<id>5</id>
<name>Tony</name>
<age>19</age>
</record>
<record>
<id>6</id>
<name>Ray</name>
<age>26</age>
</record>
<record>
<id>7</id>
<name>Leeha</name>
<age>13</age>
</record>
</data>
1.
大卫
40
2.
塔利
38
3.
索莱
32
4.
迈克尔
49
5.
托尼
19
6.
射线
26
7.
利哈
13
我希望将记录显示为类似于asp.net中的dataview,如下所示:
record 1 record2 record3 record4
record 5 record6 record7 record8
记录1记录2记录3记录4
记录5记录6记录7记录8
等等
我现在有下面的XSL,至少可以说是不可靠的
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<div>
<table style="width: 200px" border="1">
<tr>
<xsl:for-each select="data/record">
<xsl:if test="position() mod 4 = 0">
<tr></tr>
</xsl:if>
<td>
<xsl:value-of select="name"></xsl:value-of>
<br />
<xsl:value-of select="age"></xsl:value-of>
</td>
</xsl:for-each>
</tr>
</table>
</div>
</xsl:template>
</xsl:stylesheet>
所以我的问题是,我在这条路上走对了吗。。还是有更简单、更可靠的方法来实现这一点
非常感谢。我想你大致说对了,但是你在另一个
tr
中嵌入了一个空的tr
,它不会做任何有用的事情,可能会干扰浏览器。如果你发布了你期望的HTML,那么它将更清楚如何实现它。查看以下内容:
或者也包括:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<div>
<table style="width: 200px" border="1">
<tr>
<xsl:for-each select="data/record">
<td>
<xsl:value-of select="name" /><br />
<xsl:value-of select="age" />
</td>
<xsl:if test="position() mod 4 = 0 and position() != last()">
<xsl:text disable-output-escaping="yes">
</tr><tr>
</xsl:text>
</xsl:if>
</xsl:for-each>
</tr>
</table>
</div>
</xsl:template>
</xsl:stylesheet>
/trtr
我不久前写过这篇文章(我刚刚对它进行了修改,以适合您的XML模式):
变量C是列数,变量M是每个单元格的记录数。第二个答案简单而有效-虽然有一个“gotcha”,但您需要抓住最后一行正好有四个项目的情况,而不是放弃额外的插入。@Murph:我现在无法测试它,但有一个
和位置!=last()
应该可以做到这一点;我编辑了我的答案以反映这一点,ty@Rubens:我同意(我抵制住了诱惑,行使我崭新的“编辑”权利,做出完全相同的更改-还没有完全解决这个问题!)嗨,伙计们!非常感谢所有的例子。。真的很有用。我喜欢这个答案的简单性,尽管我可以理解为什么其他答案(来自下面的Erlock和上面的一个)可能有更多的灵活性。。但不管怎样,真的非常感谢!忘记将“模式”名称从默认更改为其他名称sensible@RubensFarias:使用xsl:text-disable输出转义攻击节点树输出是不好的。
<xsl:template match="/data">
<div>
<table style="width: 200px" border="1">
<xsl:apply-templates select="record[position() mod 4 = 1]"/>
</table>
</div>
</xsl:template>
<xsl:template match="record">
<row>
<xsl:apply-templates select=". | following-sibling::record[position() < 4]" mode="mode" />
</row>
</xsl:template>
<xsl:template match="record" mode="mode">
<cell>
<xsl:value-of select="id"/>
</cell>
<xsl:if test="position() = last() and position() < 3">
<xsl:call-template name="complete-row">
<xsl:with-param name="count" select="position()"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="complete-row">
<xsl:param name="count"/>
<td> </td>
<xsl:if test="($count + 1) < 3">
<xsl:call-template name="complete-row">
<xsl:with-param name="count" select="$count + 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:variable name="M" select="5"/>
<xsl:variable name="C" select="2"/>
<xsl:template match="/">
<html>
<body>
<table border="1">
<xsl:for-each select="/data/record[position() mod ($M * $C) = 1]">
<tr>
<xsl:for-each select=".|following-sibling::record[position() mod $M = 0 and position() < $M * $C]">
<td>
<xsl:for-each select=".|following-sibling::record[position() < $M]">
<xsl:value-of select="name"/><br/>
<xsl:value-of select="age"/>
</xsl:for-each>
</td>
</xsl:for-each>
<xsl:if test="position() = last()">
<xsl:call-template name="empty-cells">
<xsl:with-param name="nb" select="$C - ceiling(count(.|following-sibling::record) div $M)"/>
</xsl:call-template>
</xsl:if>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
<xsl:template name="empty-cells">
<xsl:param name="nb"/>
<xsl:if test="$nb >= 1">
<td/>
<xsl:call-template name="empty-cells">
<xsl:with-param name="nb" select="$nb - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>