我想对数据进行排序 这是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-before
和substring-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/