将十六进制颜色代码转换为HSL值,反之亦然?

时间:2013-11-13 06:54:43

标签: xml xslt colors xslt-1.0

我今天遇到了一个非常棘手的问题。我正在使用XML解析XSLT 1.0文档。 XML为我提供了HEX颜色代码,然后是颜色亮度和阴影的一些操作说明。我需要生成最终颜色值(最好是HEX或RGB值,但HSL也会这样)。

现在应用这些操作我需要将我的HEX颜色值转换为HSL。 如果它可以直接从XSL完成,那将是非常好的,否则我可能会重新解析XSL的输出并从Javascript进行转换(我想避免这种循环 - 因为它不是非常有效)。在任何一种情况下,我都需要一个转换公式。我遇到this conversion formula,但XSLT似乎太复杂了,无论如何它是RGB到HSL转换公式。

任何人都可以帮我改变这个转换吗?

提前致谢!

1 个答案:

答案 0 :(得分:2)

这个公式对我来说很简单;为什么你认为它“对于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) &lt; 2">
      <xsl:message>Hex string too short</xsl:message>
    </xsl:when>
    <xsl:when test="string-length($xy) &gt; 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

相关问题