XSLT - 根据定位添加属性值

时间:2017-09-25 02:06:54

标签: xml xslt xpath xslt-2.0

我需要使用XSLT将html表转换为另一个html表。我的目标是将表格单元格颜色修改为Zebra样式。字面上斑马风格意味着一个接一个地改变表格行的颜色。

对于简单表(有mo行合并),我使用了表行的行位置值并更改了奇数行的颜色。当表格中存在单元格合并时出现问题,这种情况我不能使用行位置值的模块值,而是我必须考虑行跨度值并做出一些逻辑。

这是一个例子,

<table>
    <tbody>
        <tr>
            <td rowspan="2">111</td>
            <td>222</td>
        </tr>
        <tr>
            <td>333</td>
        </tr>
        <tr>
            <td rowspan="4">444</td>
            <td>555</td>
        </tr>
        <tr>
            <td>666</td>
        </tr>
        <tr>
            <td>777</td>
        </tr>
        <tr>
            <td>888</td>
        </tr>
        <tr>
            <td rowspan="4">999</td>
            <td>101010</td>
        </tr>
        <tr>
            <td>111111</td>
        </tr>
        <tr>
            <td>121212</td>
        </tr>
        <tr>
            <td>131313</td>
        </tr>
        <tr>
            <td rowspan="5">141414</td>
            <td>151515</td>
        </tr>
        <tr>
            <td>161616</td>
        </tr>
        <tr>
            <td>171717</td>
        </tr>
        <tr>
            <td>181818</td>
        </tr>
        <tr>
            <td>191919</td>
        </tr>
        <tr>
            <td rowspan="4">202020</td>
            <td>212121</td>
        </tr>
        <tr>
            <td>222222</td>
        </tr>
        <tr>
            <td>232323</td>
        </tr>
        <tr>
            <td>242424</td>
        </tr>
    </tbody>
</table>

预期输出应该如下所示,

<table>
    <tbody>
        <tr>
            <td rowspan="2" color="shaded">111</td>
            <td color="shaded">222</td>
        </tr>
        <tr>
            <td color="shaded">333</td>
        </tr>
        <tr>
            <td rowspan="4">444</td>
            <td>555</td>
        </tr>
        <tr>
            <td>666</td>
        </tr>
        <tr>
            <td>777</td>
        </tr>
        <tr>
            <td>888</td>
        </tr>
        <tr>
            <td rowspan="4" color="shaded">999</td>
            <td color="shaded">101010</td>
        </tr>
        <tr>
            <td color="shaded">111111</td>
        </tr>
        <tr>
            <td color="shaded">121212</td>
        </tr>
        <tr>
            <td color="shaded">131313</td>
        </tr>
        <tr>
            <td rowspan="5">141414</td>
            <td>151515</td>
        </tr>
        <tr>
            <td>161616</td>
        </tr>
        <tr>
            <td>171717</td>
        </tr>
        <tr>
            <td>181818</td>
        </tr>
        <tr>
            <td>191919</td>
        </tr>
        <tr>
            <td rowspan="4" color="shaded">202020</td>
            <td color="shaded">212121</td>
        </tr>
        <tr>
            <td color="shaded">222222</td>
        </tr>
        <tr>
            <td color="shaded">232323</td>
        </tr>
        <tr>
            <td color="shaded">242424</td>
        </tr>
    </tbody>
</table>

这是表格html视图在转换之前和之后的方式,

before

after

我花了几周的时间从XSLT找到解决方案,但仍无法找到解决方法。任何人都可以建议我这样做的方法。

1 个答案:

答案 0 :(得分:1)

首先尝试对行进行分组:

<xsl:variable name="grouped-rows" as="element(rowgroup)*">
  <xsl:for-each-group select="td" group-starting-with="td[@rowspan]">
    <rowgroup><xsl:copy-of select="current-group()"/></rowgroup>
  </
</

然后迭代群组:

<xsl:for-each select="$grouped-rows">
  <xsl:variable name="style" select="if (position() mod 2 = 0) then 'pink' else 'blue'"/>
  <xsl:for-each select="child::td">
    <td class="{$style}">
      <xsl:copy-of select="@*, node()"/>
    </
  </
</