我有以下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</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>
我希望将记录显示为类似于asp.net中的数据视图,如下所示:
record 1 record2 record3 record4 record 5 record6 record7 record8
等等。
我现在有以下XSL,至少可以说是shakey!
<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>
所以我的问题是,我在这里是正确的道路吗?还是有更简单,更健壮的方法来实现这一目标?
非常感谢提前。
答案 0 :(得分:1)
检查出来:How can I break a table row in xsl after a specified count?
或者这个:
<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>
答案 1 :(得分:1)
<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>
答案 2 :(得分:0)
我认为你大致上是正确的行,但是你在另一个tr
中嵌入了一个空的tr
,它不会做任何有用的事情并且可能会污染浏览器。如果你发布了你期望的HTML,那么如何实现它将更加清晰。
答案 3 :(得分:0)
我刚才写过这篇文章(我刚刚根据你的XML架构对其进行了调整):
<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>
变量C是列数,变量M是每个单元格的记录数。