我有以下xml:
输入
<page>
<group category="cat1">
<item fileunder="#">.45 colt</item>
<item fileunder="#">8 queens</item>
<item fileunder="#">9 lives</item>
<item fileunder="#">99 bottles of beer</item>
<item fileunder="A">An innocent man</item>
<item fileunder="A">Academy awards</item>
<item fileunder="B">Before the dawn</item>
</group>
<group category="cat2">
<item fileunder="R">Rows of houses</item>
</group>
</page>
输入项已经排序。
期望的输出
我想为 each 生成一个 3 列 HTML 表格,每个group
不同的 都有一个副标题(一个 3 列跨越单元格)fileunder
,最佳地呈现在自上而下的 then-next-column 中(项目已经排序):
<table>
<tr><td colspan="3">#</td></tr>
<tr><td>.45 colt</td><td>9 lives</td><td>99 bottles of beer</td></tr>
<tr><td>8 queens</td></tr>
<tr><td colspan="3">A</td></tr>
<tr><td>An innocent man</td><td>Academy awards</td></tr>
<tr><td colspan="3">B</td></tr>
<tr><td>Before the dawn</td></tr>
</table>
<table>
<tr><td colspan="3">R</td></tr>
<tr><td>Rows of houses</td></tr>
</table>
如果项目以从左到右,然后是下一行的形式呈现,我可以活下去。
到目前为止,我所拥有的是:
当前 xslt
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="itm_grp" match="/page/group/item" use="concat(../@category,':',@fileunder)"/>
<xsl:template match="page/group">
<table>
<xsl:for-each select="item[.=key('itm_grp',concat(../@category,':',@fileunder))[1]]">
<tr><td colspan="3"><xsl:value-of select="@fileunder"/></td></tr>
<xsl:variable name="nodeset" select="key('itm_grp',concat(../@category,':',@fileunder))"/>
<xsl:for-each select="$nodeset[position() mod 3=1]">
<tr>
<td><xsl:value-of select="."/></td>
<td><xsl:value-of select="following-sibling::item[1]"/></td>
<td><xsl:value-of select="following-sibling::item[2]"/></td>
</tr>
</xsl:for-each>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
它产生从左到右,然后是下一行的输出(非最佳);但是,following-sibling
选择会产生“渗透”效果:
#
.45 colt 8 queens 9 lives
99 bottles of beer An innocent man Academy awards
A
An innocent man Academy awards Before the dawn
B
Before the dawn
R
Rows of houses
如您所见,fileunder
#
有两个 A 项,fileunder
A
一个 B 项。
所以,我的问题是:
如何产生所需的输出(按列)?
如果我不能这样做,我怎样才能让逐行输出避免“出血”?
请注意,我对 XSLT 的经验很少,所以如果我的代码公然低效/愚蠢/无论如何,请随时通过替换所有代码来教育我!
注意:XSLT 版本 1,因此显然没有index-of
可用的功能。