我正在尝试将行的范围分组,以便我可以交替设置每个组的背景颜色。我还想将第一列合并到一个单元格中。这是我到目前为止所做的。
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>
当前输出
预期输出
答案 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>