使用XSL对行进行分组并合并输出HTML单元格

时间:2015-07-23 13:56:40

标签: xml xslt xslt-1.0

我正在尝试将行的范围分组,以便我可以交替设置每个组的背景颜色。我还想将第一列合并到一个单元格中。这是我到目前为止所做的。

XML

<Action>
    <Step>
        <Obj>UC_A</Obj>
    </Step>
    <Step>
        <Obj>abc</Obj>
    </Step>
    <Step>
        <Obj>bcd</Obj>
    </Step>
    <Step>
        <Obj>cde</Obj>
    </Step>
    <Step>
        <Obj>UC_B</Obj>
    </Step>
    <Step>
        <Obj>def</Obj>
    </Step>
    <Step>
        <Obj>efg</Obj>
    </Step>
    <Step>
        <Obj>UC_C</Obj>
    </Step>
    <Step>
        <Obj>abc</Obj>
    </Step>
    <Step>
        <Obj>bcd</Obj>
    </Step>
    <Step>
        <Obj>cde</Obj>
    </Step>
</Action>

XSL

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/Action">
        <html>
            <head>
                <style type="text/css">
                    table { table-layout:auto; border-collapse:collapse; font-family:Arial; }
                    td { vertical-align:top; border:1px solid Silver; padding:0pt; font-size:9pt; padding-right:3px; padding-left:3px; }
                    tr.ODD { background-color:#FFFFDB; }
                    tr.EVEN { background-color:#E9FFFF; }
                </style>
            </head>
            <body>
                <table>
                    <xsl:apply-templates/>  
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="Step">
        <xsl:variable name="UCBgColor">
            <xsl:if test="starts-with(Obj, 'UC_')">
                <xsl:variable name="IsOddEven">
                    <xsl:number count="Step[starts-with(Obj, 'UC_')]"/>
                </xsl:variable>
                <xsl:choose>
                    <xsl:when test="$IsOddEven mod 2 = 0">EVEN</xsl:when>
                    <xsl:otherwise>ODD</xsl:otherwise>
                </xsl:choose>
            </xsl:if>
        </xsl:variable>

        <tr class="{$UCBgColor}">
            <td>
                <xsl:if test="starts-with(Obj, 'UC_')">
                    <xsl:number count="Step[starts-with(Obj, 'UC_')]"/>
                </xsl:if>
            </td>
            <td>
                <xsl:value-of select="Obj" />
            </td>
        </tr>
    </xsl:template>
</xsl:stylesheet>

当前输出

enter image description here

预期输出

enter image description here

1 个答案:

答案 0 :(得分:2)

要添加rowspan属性,请使用类似

的方法
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" omit-xml-declaration="yes" version="5.0" doctype-system="about:legacy-compat" encoding="utf-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:key name="group" match="Step[Obj[not(starts-with(., 'UC_'))]]" use="generate-id(preceding-sibling::Step[Obj[starts-with(., 'UC_')]][1])"/>

    <xsl:template match="/Action">
        <html>
            <head>
                <style type="text/css">
                    table { table-layout:auto; border-collapse:collapse; font-family:Arial; }
                    td { vertical-align:top; border:1px solid Silver; padding:0pt; font-size:9pt; padding-right:3px; padding-left:3px; }
                    tr.ODD { background-color:#FFFFDB; }
                    tr.EVEN { background-color:#E9FFFF; }
                </style>
            </head>
            <body>
                <table>
                    <xsl:apply-templates select="Step[starts-with(Obj, 'UC_')]"/>  
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="Step[starts-with(Obj, 'UC_')]">
        <xsl:variable name="UCBgColor">
            <xsl:if test="starts-with(Obj, 'UC_')">
                <xsl:variable name="IsOddEven">
                    <xsl:number count="Step[starts-with(Obj, 'UC_')]"/>
                </xsl:variable>
                <xsl:choose>
                    <xsl:when test="$IsOddEven mod 2 = 0">EVEN</xsl:when>
                    <xsl:otherwise>ODD</xsl:otherwise>
                </xsl:choose>
            </xsl:if>
        </xsl:variable> 
        <xsl:variable name="group" select="key('group', generate-id())"/>
        <tr class="{$UCBgColor}">
            <td rowspan="{1 + count($group)}">
                <xsl:number count="Step[starts-with(Obj, 'UC_')]"/>
            </td>
            <td>
                <xsl:value-of select="Obj"/>
            </td>
        </tr>


        <xsl:apply-templates select="$group">
            <xsl:with-param name="UCBgColor" select="$UCBgColor"/>
        </xsl:apply-templates>

    </xsl:template>

    <xsl:template match="Step[not(starts-with(Obj, 'UC_'))]">
        <xsl:param name="UCBgColor"/>
        <tr class="{$UCBgColor}">
            <td>
                <xsl:value-of select="Obj"/>
            </td>
        </tr>
    </xsl:template>

</xsl:stylesheet>

http://xsltransform.net/gWmuiK9/2在线。