【问题标题】:Convert hex color codes into HSL value and vice-versa?将十六进制颜色代码转换为 HSL 值,反之亦然?
【发布时间】:2013-11-13 06:54:42
【问题描述】:

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

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

谁能帮我完成这个转换?

提前致谢!

【问题讨论】:

  • @Teemu thanx,我去看看
  • @Teemu 链接中的代码是用 javascript 编写的,尽管其中大部分都可以用 XSLT 编写,但遗憾的是,XSLT 1.0 不支持以 16 为基数的 parseInt() 等部分代码。我正在尝试避免使用 javascript,知道我该怎么做吗?
  • 一开始你可以从帖子中删除 [javascript] 标签; )。

标签: xml xslt colors xslt-1.0


【解决方案1】:

这个公式对我来说很简单;为什么你认为它“对于 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

【讨论】:

  • Thnx McQueer,我已经写了一个类似的程序,但无论如何 +1。
猜你喜欢
  • 2010-09-17
  • 2021-08-15
  • 1970-01-01
  • 2012-09-18
  • 2021-07-17
  • 2012-05-14
  • 2018-09-22
  • 2011-03-23
  • 1970-01-01
相关资源
最近更新 更多