gpt4 book ai didi

xslt - 如何在 XSLT 中应用字母数字排序

转载 作者:行者123 更新时间:2023-12-02 09:01:38 26 4
gpt4 key购买 nike

根据以下 XML,在 XSL 中实现字母数字排序的最佳方法是什么?

编辑:澄清一下,下面的 XML 只是一个简单的示例,真正的 XML 将包含更多的变体值。

<colors>
<item>
<label>Yellow 100</label>
</item>
<item>
<label>Blue 12</label>
</item>
<item>
<label>Orange 3</label>
</item>
<item>
<label>Yellow 10</label>
</item>
<item>
<label>Orange 26</label>
</item>
<item>
<label>Blue 117</label>
</item>
</colors>

例如我想要按以下顺序得到最终结果:

Blue 12, Blue 117, Orange 3, Orange 26, Yellow 10, Yellow 100

这就是我想要的“有效”。

<xsl:apply-templates select="colors/item">
<xsl:sort select="label" data-type="text" order="ascending"/><!--1st sort-->
<xsl:sort select="label" data-type="number" order="ascending"/><!--2nd sort-->
</xsl:apply-templates>

<xsl:template match="item">
<xsl:value-of select="label"/>
<xsl:if test="position() != last()">,</xsl:if>
</xsl:template>

最佳答案

在您的示例中,使用 substring-beforesubstring-after 将标签文本拆分为文本和数字部分(但是,这不是通用方法,而是你明白了):

<xsl:template match="/">
<xsl:apply-templates select="colors/item">
<xsl:sort select="substring-before(label, ' ')" data-type="text" order="ascending"/>
<!--1st sort-->
<xsl:sort select="substring-after(label, ' ')" data-type="number" order="ascending"/>
<!--2nd sort-->
</xsl:apply-templates>
</xsl:template>

<xsl:template match="item">
<xsl:value-of select="label"/>
<xsl:if test="position() != last()">, </xsl:if>
</xsl:template>

这给出了以下输出:

Blue 12, Blue 117, Orange 3, Orange 26, Yellow 10, Yellow 100

更新

解决排序问题的更通用方法是让 xls:sort 元素的 select 属性包含一个可根据排序规则进行排序的字符串你所期望的。例如。在此字符串中,所有数字都可以用前导 0 填充,以便按字典顺序将它们排序为 data-type="text" 将得到正确的字母数字顺序。

如果您使用 .NET 的 XSLT 引擎,您可以使用 C# 中的简单扩展函数来用前导 0 填充数字:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:myExt="urn:myExtension"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl myExt">
<xsl:output method="xml" indent="yes" />

<msxsl:script language="C#" implements-prefix="myExt">

<![CDATA[
private static string PadMatch(Match match)
{
// pad numbers with zeros to a maximum length of the largest int value
int maxLength = int.MaxValue.ToString().Length;
return match.Value.PadLeft(maxLength, '0');
}

public string padNumbers(string text)
{
return System.Text.RegularExpressions.Regex.Replace(text, "[0-9]+", new System.Text.RegularExpressions.MatchEvaluator(PadMatch));
}
]]>

</msxsl:script>
<xsl:template match="/">
<sorted>
<xsl:apply-templates select="colors/item">
<xsl:sort select="myExt:padNumbers(label)" data-type="text" order="ascending"/>
</xsl:apply-templates>
</sorted>
</xsl:template>

<xsl:template match="item">
<xsl:value-of select="label"/>
<xsl:if test="position() != last()">, </xsl:if>
</xsl:template>

</xsl:stylesheet>

关于xslt - 如何在 XSLT 中应用字母数字排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/777930/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com