我试图通过包含十六进制值的元素对我的转换输出进行排序.
<xsl:sort select="Generation/Sirio/Code" data-type="number"/>
值是普通的旧十六进制:00 01 02 ... 0A ... FF但它们的排序方式如下:0A FF 00 01 02这表示排序方法一旦涉及到字符就会失败.
我该如何解决这个问题?
非常感谢你!
这种转变:
<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变量保存此零字符串,并用于用零向左侧填充每个排序键,以便所有排序键具有相同的长度。
| 归档时间: |
|
| 查看次数: |
371 次 |
| 最近记录: |