【发布时间】:2012-01-13 05:54:59
【问题描述】:
我的源 xml 看起来像:
<TABLE>
<ROW>
<CELL ROWSPAN="3"> Test </CELL>
<CELL ROWSPAN="2"> Test </CELL>
<CELL ROWSPAN="1"> Test </CELL>
<CELL ROWSPAN="3"> Test </CELL>
<CELL ROWSPAN="1"> Test </CELL>
</ROW>
<ROW>
<CELL ROWSPAN="1"> Test </CELL>
<CELL ROWSPAN="1"> Test </CELL>
</ROW>
</TABLE>
正确转换后的输出应如下所示:
<tbody>
<row>
<entry colname="1"> Test </entry>
<entry colname="2"> Test </entry>
<entry colname="3"> Test </entry>
<entry colname="4"> Test </entry>
<entry colname="5"> Test </entry>
</row>
<row>
<entry colname="3"> Test </entry>
<entry colname="5"> Test </entry>
</row>
</tbody>
如您所见,棘手的部分是第二行元素。由于第一行有多个单元格占据多行,因此会影响第二行的列名,这就是为什么第二行的第一个条目以列名“3”而不是“1”开头的原因。我不知道这里怎么画表格,但是如果你把它画在纸上,你会很容易理解的。
目前,我有以下 xsl 可以部分捕获这一点(我省略了其他信息,因为我只有 @colname 有问题)
<xsl:template match="CELL">
<xsl:if test="../preceding-sibling::ROW[1]/CELL[1]/@ROWSPAN > 1">
<xsl:attribute name="colname" select="position()+count(../preceding-sibling::ROW[1]/CELL[@ROWSPAN>1])"/>
..
</xsl:if>
</xsl:template>
这不会很好,因为它会将具有多行跨度的所有 CELL 包括在其计数中,因此结果将如下所示:
<row>
<entry colname="4"> Test </entry>
<entry colname="5"> Test </entry>
</row>
虽然第一个条目实际上应该从 3 开始。
我发现描述这个问题有点困难,但我会尽力而为,如果需要进一步的信息,请在下面发表评论。
【问题讨论】:
-
我从未使用过
rowspan,也不知道它应该是什么意思。 XSLT 和 XPath 专家不应该知道任何特定的 XML 词汇,即使它恰好是 XHTML。请用rowspan的含义定义编辑问题。 -
这看起来很棘手,考虑到输出可能取决于任意数量的先前
ROW元素。我有一个想法在脑海中浮现,使用递归模板依次处理每一行,从前一行传入一个“占用”行的列表,但需要一些时间来充实。 -
快速提问:您是否也喜欢使用
COLSPAN标签?如果是这样,事情就会变得非常复杂。 -
@Flynn1179 没有使用 COLSPAN,我使用了 namest 和 namend。
标签: xml xslt xpath html-table