xml - 使用由文本和数值组成的数据对 xslt 进行排序

标签 xml sorting xslt

我想对数据进行排序 这是xml文件

<item name="HOUSE 10">
</item>
<item name="HOUSE 2">
</item>
<item name="MY 3 APPARTMENT">
</item>
<item name="MY 15 APPARTMENT">
</item>

我想得到: “2号楼,10号楼,我的3号公寓,我的15号公寓”

但是我明白了 “10 号房子,2 号房子,我的 15 号公寓 15,我的 3 号公寓”

注意

我真的真的很抱歉

当然,HOUSE 必须先于 MY

抱歉,直到现在我才真正理解您的言论

注释结束

我的xlst是:

<xsl:for-each select="//item>
<xsl:sort data-type="number" select="./@name"/>
</xsl>

我怎样才能做到?

EDITED1:标签中数值的数量或位置没有“逻辑”,数值可以放在任何地方。

EIDTED2: 我想到了一个主意,而且就快实现了

我创建了一个Java函数 此函数将数字与最高位的位置连接起来。 基本上它会返回

HOUSE 10 => HOUSE 210
HOUSE 2 => HOUSE 12
MY 3 APPARTMENT => MY 13 APPARTMENT
MY 15 APPARTMENT => MY 215 APPARTMENT

public static String concateneHighestDigit(String name){
    Pattern digitPattern = Pattern.compile("(\\d+)"); // 

    Matcher matcher = digitPattern.matcher(name);
    StringBuffer result = new StringBuffer();
    int i = 0;
    while (matcher.find())
    {
         matcher.appendReplacement(result, String.valueOf(matcher.group(1).length())+ matcher.group(1));
    }
    matcher.appendTail(result);
    System.out.println("result :" + result);
    return result.toString();

}

在 xlst 中我有

 <xsl:sort data-type="number" select="special:concateneHighestDigit(./@name)"/>

哪里

  special

对应自定义的xmlns

仍然不行,但我想我已经不远了

最佳答案

您正在将字符串按数字排序。它不会正确排序。

此外,您希望按字符顺序对字符串进行排序,并按数字顺序对数字进行排序。为了实现这一点,您必须将术语分开,并分别排序字符串和数字。您可以使用两个 xsl:sort 来完成此操作:

<xsl:for-each select="item">
    <xsl:sort data-type="text"   select="substring-before(@name, ' ')"/>
    <xsl:sort data-type="number" select="substring-after(@name, ' ')"/>
    <item><xsl:value-of select="@name"/></item>
</xsl:for-each>

考虑到您有一个个单词后跟一个个数字,这将起作用,因为substring-beforesubstring-after 将返回第一个空格之前或之后的字符串。

更新

您根据新要求编辑了问题:

  • 一个数字,它可以出现在文本中的任何位置;
  • 文本中的任何位置都可能有空格。

您仍然可以使用两个 xs:sort 表达式。您只需要找到一种方法来提取数字和字符串即可在排序中使用它们。如果您可以使用XSLT 2.0,那么您可以使用正则表达式。此代码删除数字或非数字以获得每种情况的排序数据:

<xsl:for-each select="item">
     <xsl:sort data-type="text" select="normalize-space(replace(@name, '\d+',''))"/>
     <xsl:sort data-type="number" select="normalize-space(replace(@name, '\D+',''))"/>
     <item><xsl:value-of select="@name"/></item>
</xsl:for-each>

关于xml - 使用由文本和数值组成的数据对 xslt 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23657365/

相关文章:

javascript - 在 HTML 中的特定表格单元格中显示消息对话框

xml - 使用 xslt/c# 比较两个 xml 文件

xml - 选择并在XSLT中附加当前节点的文本值?

javascript - 将日期值转换为 xslt 中的字符串日期格式

c# - LINQ:根据属性值从 XML 中删除元素?

c - 让 lex 读取 UTF-8 不起作用

java - 测试随机数生成器

javascript - 在 JavaScript 中对数组进行排序 : items with most elements in descending order

c++ - 我找不到段错误?

xml - 基本 XML/XSLT - 存在多个同名元素时的值