>我今天遇到了一个非常棘手的问题。我正在使用XSLT 1.0
解析XML
文档。XML
为我提供了十六进制颜色代码,然后是有关颜色亮度和阴影的一些操作说明。我需要生成一个最终的颜色值(最好是十六进制或 RGB 值,但 HSL 也可以)。
现在要应用这些操作,我需要将我的十六进制颜色值转换为 HSL。如果可以直接从 XSL 中完成,那就太好了,否则我可能会重新解析 XSL 的输出并从 Javascript 进行转换(我想避免这种迂回的方式,因为它不是很有效)。无论哪种情况,我都需要一个转换公式。我遇到了这个转换公式,但它对XSLT
来说似乎太复杂了,无论如何它是一个 RGB 到 HSL 的转换公式。
谁能帮我进行这种转换?
提前感谢!
这个公式对我来说很简单;为什么你认为它"对于XSLT来说太复杂了"?
看起来您最初的问题是您不知道如何在 XSLT 1.0 中将十六进制数转换为小数。 这是一个简单的模板来做到这一点;它接受两位十六进制数字并返回十进制等效数。
<!--* Given a two-digit hex string, return the equivalent number in decimal. *-->
<xsl:template name="hex_to_dec">
<xsl:param name="raw-hex" select="'00'"/>
<!--* a list of hex digits, in numerical order *-->
<xsl:variable name="hex-digits" select="'0123456789ABCDEF'"/>
<!--* strip space and uppercase a-f *-->
<xsl:variable name="xy"
select="normalize-space(translate($raw-hex,'abcdef','ABCDEF'))"/>
<xsl:choose>
<xsl:when test="translate($xy,$hex-digits,'') != ''">
<xsl:message><xsl:value-of select="$raw-hex"
/> is not a legal hexadecimal string</xsl:message>
</xsl:when>
<xsl:when test="string-length($xy) < 2">
<xsl:message>Hex string too short</xsl:message>
</xsl:when>
<xsl:when test="string-length($xy) > 2">
<xsl:message>Hex string too long</xsl:message>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="X" select="substring($xy,1,1)"/>
<xsl:variable name="Y" select="substring($xy,2,1)"/>
<xsl:variable name="Xval"
select="string-length(substring-before($hex-digits,$X))"/>
<xsl:variable name="Yval"
select="string-length(substring-before($hex-digits,$Y))"/>
<xsl:value-of select="16 * $Xval + $Yval"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
如果我是你,我会首先编写一个名为 rgb_to_hsl
的模板,接受 0 255 之间的三个十进制数字作为参数 R、G 和 B,并计算一个 HSL 字符串。 然后,我将编写第二个模板来接受RGB十六进制字符串,解析出红色,绿色和蓝色的十六进制值,使用上面给出的模板将它们转换为小数,然后调用rgb_to_hsl
。