XSLT如何按国籍条件为人员姓名设置不同HTML显示颜色
解决方案
你可以通过为每个国籍分组生成唯一的颜色值,再给姓名包裹带style属性的span标签实现需求,下面是两种常用实现方式:
方式1:自动按分组顺序生成不同颜色(无需预定义映射,适配任意数量国籍)
利用HSL颜色模式,根据分组的position()值动态调整色相,自动为每个国籍分配区分度高的不同颜色,修改后的模板代码如下:
<xsl:template match="list"> <html> <body> <xsl:for-each-group select="group/person" group-by="@nat"> <!-- 动态生成HSL颜色,色相间隔30度保证区分度 --> <xsl:variable name="color" select="concat('hsl(', (position() - 1) * 30, ', 80%, 40%)')"/> <b><xsl:value-of select="current-grouping-key()"/>: </b> <p> <!-- 遍历当前分组的每个姓名,包裹带颜色样式的span --> <xsl:for-each select="current-group()/name"> <span style="color: {$color};"> <xsl:value-of select="."/> </span> <!-- 非最后一项加逗号分隔 --> <xsl:if test="position() != last()">, </xsl:if> </xsl:for-each> </p> </xsl:for-each-group> </body> </html> </xsl:template>
代码说明:
- 用
hsl(色相, 饱和度, 亮度)模式生成颜色,每个分组色相相差30度,保证不同国籍颜色差异明显 - 替换原来直接用
value-of批量输出姓名的逻辑,改为遍历每个姓名单独包裹带样式的span标签
方式2:预定义国籍和颜色的映射(固定国籍对应固定颜色)
如果需要特定国籍对应指定颜色,可以用<xsl:choose>做判断,示例如下:
<xsl:template match="list"> <html> <body> <xsl:for-each-group select="group/person" group-by="@nat"> <!-- 预定义国籍对应颜色 --> <xsl:variable name="nat" select="current-grouping-key()"/> <xsl:variable name="color"> <xsl:choose> <xsl:when test="$nat = 'france'">#ff0000</xsl:when> <xsl:when test="$nat = 'poland'">#0000ff</xsl:when> <xsl:when test="$nat = 'uk'">#008000</xsl:when> <xsl:otherwise>#333333</xsl:otherwise> </xsl:choose> </xsl:variable> <b><xsl:value-of select="$nat"/>: </b> <p> <xsl:for-each select="current-group()/name"> <span style="color: {$color};"> <xsl:value-of select="."/> </span> <xsl:if test="position() != last()">, </xsl:if> </xsl:for-each> </p> </xsl:for-each-group> </body> </html> </xsl:template>
两种方式都可以实现需求,可根据是否需要固定国籍对应固定颜色自行选择。
内容的提问来源于stack exchange,提问作者user7233170
相关产品推荐
相关产品推荐

