XSLT - 计算元素中的属性

时间:2013-03-01 12:06:26

标签: xml xslt

我有类似于

的XML
<BOXHEAD>
  <COLHEAD H="1">Item</COLHEAD>
  <COLHEAD H="2">Cost</COLHEAD>
  <COLHEAD H="3">Direct</COLHEAD>
  <COLHEAD H="3">In-Direct</COLHEAD>
  <COLHEAD H="2">Revenue</COLHEAD>
  <COLHEAD H="3">1989</COLHEAD>
  <COLHEAD H="3">1990</COLHEAD>
</BOXHEAD>

我尝试过与此类似的内容转换为HTML COLSPAN:

<xsl:if test="@H=2">
    <xsl:variable name="descendants" select="following-sibling::COLHEAD[@H = 3]"/>
    <xsl:variable name="number_of_columns_under_this" select="count($descendants)"/>
    <xsl:if test="$number_of_columns_under_this &gt; 1">
        <xsl:attribute name="colspan">
            <xsl:value-of select="$number_of_columns_under_this"/>
        </xsl:attribute>
    </xsl:if>
</xsl:if>

期望的结果:“费用”列应该出现在colspan="2",但当然count()会获取该块中@H="3"的所有四个。我正在尝试将古老的SGML转换为HTML表格。期望的输出类似于:

<table>
<tbody>
<tr>
    <td colspan="1" rowspan="2">Item</td>
    <td colspan="2" rowspan="1">Cost</td>
    <td colspan="2" rowspan="1">Revenue</td>
</tr>
<tr>
    <td>Direct</td>
    <td>In-Direct</td>
    <td>1989</td>
    <td>1990</td>
</tr>
</tbody>
</table>

计算rowspan和colspan对我来说很难。

2 个答案:

答案 0 :(得分:3)

你可以使用这样的技巧

<xsl:variable name="descendants"
    select="following-sibling::COLHEAD[@H = 3]
       [generate-id((preceding-sibling::COLHEAD[@H=2])[last()])
         = generate-id(current())]"/>

这会选择最近前兄弟COLHEAD[@H=3]的所有@H=2个元素,这些元素是我们当前正在查看的元素。

答案 1 :(得分:2)

如果您使用的是XSLT 2.0,则应该使用位置分组,例如<xsl:for-each-group group-starting-with="[@H='2']>。但如果不确切知道您想要什么输出,很难为您提供更多细节。