这些是我的xml
<elemetns>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
...
<item>...</item>
<elemetns>
out out shoud创建一个包含4个列的html表
<xsl:template match="Item" mode="single">
from current position 4 items and build the first row with item data
</xsl:template>
有什么想法吗?
答案 0 :(得分:2)
以下方法应该有所帮助:
<xsl:template match="elements">
<table>
<tbody>
<xsl:apply-templates select="item[position() mod 4 = 1]" mode="row"/>
</tbody>
</table>
</xsl:template>
<xsl:template match="item" mode="row">
<tr>
<xsl:apply-templates select=". | following-sibling::item[position() < 4]" mode="cell"/>
</tr>
</xsl:template>
<xsl:template match="item" mode="cell">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
答案 1 :(得分:1)
使用xslt 1.0的另一种方法是使用键:
鉴于此XML:
<?xml version="1.0" encoding="UTF-8"?>
<elements>
<item>r1c1</item>
<item>r1c2</item>
<item>r1c3</item>
<item>r1c4</item>
<item>r2c1</item>
<item>r2c2</item>
<item>r2c3</item>
<item>r2c4</item>
<item>r3c1</item>
<item>r3c2</item>
<item>r3c3</item>
</elements>
以下样式表
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="html"/>
<xsl:key name="items-by-row" match="elements/item"
use="floor(count(preceding-sibling::item) div 4) + 1"/>
<xsl:template match="/">
<table>
<xsl:apply-templates select="//item[position() mod 4 = 1]" mode="row"/>
</table>
</xsl:template>
<xsl:template match="item" mode="row">
<tr>
<xsl:apply-templates select="key('items-by-row', position())" mode="cell"/>
<xsl:variable name="span" select="4 - count(key('items-by-row', position()))"/>
<xsl:if test="$span > 0">
<xsl:call-template name="handle-colspan">
<xsl:with-param name="span" select="$span"/>
</xsl:call-template>
</xsl:if>
</tr>
</xsl:template>
<xsl:template name="handle-colspan">
<xsl:param name="span"/>
<!--suppress CheckTagEmptyBody -->
<td>
<xsl:if test="$span > 1">
<xsl:attribute name="colspan">
<xsl:value-of select="$span + 1"/>
</xsl:attribute>
</xsl:if>
</td>
</xsl:template>
<xsl:template match="item" mode="cell">
<td>
<xsl:apply-templates/>
</td>
</xsl:template>
</xsl:stylesheet>
产生以下结果:
<table>
<tr>
<td>r1c1</td>
<td>r1c2</td>
<td>r1c3</td>
<td>r1c4</td>
</tr>
<tr>
<td>r2c1</td>
<td>r2c2</td>
<td>r2c3</td>
<td>r2c4</td>
</tr>
<tr>
<td>r3c1</td>
<td>r3c2</td>
<td>r3c3</td>
<td></td>
</tr>
</table>
请注意,使用handle-colspan
模板我正在插入其他td
元素,以便生成正确的表格。