私は次の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>
入力項目はすでにソートされています。
希望の出力
すべての ごとに 3 列の HTML テーブルを作成し、group
個別の ごとにサブヘッダー (3 列にまたがるセル) を作成fileunder
し、トップダウンで次の列に最適に表示します (アイテムは既に並べ替えられています)。
<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 項目が 2 つ、fileunder
A
B 項目が 1 つあります。
だから、私の質問は:
目的の出力 (列単位) を生成するにはどうすればよいですか?
それができない場合、行単位の出力で「出血」を回避するにはどうすればよいですか?
私は XSLT の経験がほとんどないことに注意してください。そのため、私のコードが明らかに非効率的/ばかげている/その他の場合は、すべてを置き換えて自由に教えてください!
注意: XSLT バージョン 1 であるため、明らかにindex-of
機能はありません。