2014-05-14 44 views
2

組成的數據排序XSLT我想對數據進行排序 這是xml文件有文字和數值

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

我想獲得: 「HOUSE 2 HOUSE 10,我的3個APPARTMENT ,我的15 APPARTMENT」

,但我得到 「HOUSE 10,HOUSE 2,MY 15 APPARTMENT 15,我的3個APPARTMENT」

注意

我真的真的很抱歉

當然

HOUSE必須出現在我的

對不起,我真的不明白你說的話到現在爲止

結束注意

我XLST是:

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

我該怎麼做?

EDITED1:關於標籤中數值的數量或位置沒有「邏輯」,數值可以放在任何位置。

EIDTED2: 我想出了一個主意,我幾乎沒有

我創建了一個Java函數 此功能concatenes最高位的現在的位置數。 基本上它返回

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 

correponds到自定義的xmlns

它仍然無法正常工作,但我認爲我不太遠

+1

「*沒有固定數量的單詞*」在輸入中是否有任何**是**固定的?如果我想建議您僅使用@name屬性中的**數字**,則可以將示例更改爲「我的第三商店#15」 - 然後呢? –

+0

我已經在新編輯中回答了您的評論 – stackSaru

+0

不,您沒有:如果有兩個(或更多)數值會怎麼樣? –

回答

0

找到了!

通過將「編號」更改爲「文本」,它可以工作。 不過我不明白,爲什麼

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

感謝大家的支持,您的評論! 它真的幫助調試!

1

您正在將一個字符串排序爲數字。它不會正確排序。

此外,您要按字符順序排序字符串,並按數字順序排列數字。爲了實現這一點,你必須分開條款和命令字符串和數字。您可以有兩個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會前或第一空間後返回的字符串。

UPDATE

你編輯的新要求,你的問題:

  • 一個號碼,它可以在文本任何位置出現。
  • 文本可能在任何地方都有空格。

您仍然可以使用兩個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> 
+0

編輯:非常感謝helderdarocha!不幸的是,我有一個隨機數字和一個可以放在任何地方的數字。 – stackSaru

+1

在這種情況下,如果您可以找到可以從字符串中識別並提取數字的模式,則仍然可以使用兩個'sorts'。你可以通過'substring'函數實現,如果你使用XSLT 2.0,你可以使用regex。 – helderdarocha

+0

唯一的模式是在日期某處的數值 – stackSaru

1

撒克遜人都有一個歸類,會做這樣的排序:

<xsl:sort select="@name" collation="http://saxon.sf.net/collation?alphanumeric=yes"/> 

這將排序「房子2「在」房屋10「之前。但它會在「我的3間公寓」之前排列「房子2」,因爲「h」在「m」之前排序。

+0

非常感謝,當然「h」排在「m」之前我現在犯了一個很大的錯誤,現在我編輯了 – stackSaru

相關問題