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

基于以下XML,在XSL中实现字母数字排序的最佳方式是什么?如何在XSLT中应用字母数字排序

编辑:为了澄清,下面的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,你可以在C#中使用一个简单的扩展功能键盘的数字与0领先的XSLT引擎:

<?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中应用字母数字排序 的全部内容, 来源链接: utcz.com/qa/264093.html

回到顶部