如何在xslt中按十六进制排序?

ata*_*man 6 sorting xslt hex

我试图通过包含十六进制值的元素对我的转换输出进行排序.

<xsl:sort select="Generation/Sirio/Code" data-type="number"/>

值是普通的旧十六进制:00 01 02 ... 0A ... FF但它们的排序方式如下:0A FF 00 01 02这表示排序方法一旦涉及到字符就会失败.

我该如何解决这个问题?

非常感谢你!

Dim*_*hev 2

这种转变

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:variable name="vZeroes"
     select="'00000000000000000000000000000000000000'"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="/*">
  <xsl:copy>
    <xsl:apply-templates select="*">
       <xsl:sort select=
         "concat(substring($vZeroes,
                           1,
                           string-length($vZeroes)
                          -
                           string-length(@hexVal)
                           ),
                  translate(@hexVal,'abcdef','ABCDEF')
                 )
         "/>
    </xsl:apply-templates>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

当应用于此 XML 文档时:

<t>
  <x hexVal="0A"/>
  <x hexVal="0327FE"/>
  <x hexVal="ff5240"/>
  <x hexVal="1BA402"/>
  <x hexVal="C3A214"/>
</t>
Run Code Online (Sandbox Code Playgroud)

产生想要的正确结果:

<t>
   <x hexVal="0A"/>
   <x hexVal="0327FE"/>
   <x hexVal="1BA402"/>
   <x hexVal="C3A214"/>
   <x hexVal="ff5240"/>
</t>
Run Code Online (Sandbox Code Playgroud)

解决方案详情

该解决方案所做的唯一假设是十六进制排序键的最大长度是有限的(例如 20)。然后我们使用一串比这个最大长度长的零。该$vZeroes变量保存此零字符串,并用于用零向左侧填充每个排序键,以便所有排序键具有相同的长度。