2017-04-03 20 views
3

我有,我想已經整理這些ID值:如何對包含數字但有時也包含字母的XML條目進行排序?

<rule id="1.1"> 
</rule> 
<rule id="1.2"> 
</rule> 
<rule id="1.3"> 
</rule> 
<rule id="Id. 4.3"> 
</rule> 
<rule id="Id. 4.9"> 
</rule> 
<rule id="Id. 4.10"> 
</rule> 
<rule id="Id. 4.11"> 
</rule> 
<rule id="Id. 4.12"> 
</rule> 

目前,我想有點像這樣。這適用於只有數字的id值,但不適用於也有字母的值。

<xsl:sort select="substring-before(@id, '.')" data-type="number"/> 
<xsl:sort select="substring-after(@id, '.')" data-type="number"/> 

它目前給我的順序是:

Id. 4.10 
Id. 4.11 
Id. 4.12 
Id. 4.3 
Id. 4.9 
1.1 
1.2 
1.3 

我哪有這麼順序排序的:

Id. 4.3 
Id. 4.9 
Id. 4.10 
Id. 4.11 
Id. 4.12 
1.1 
1.2 
1.3 
+0

請解釋所需排序的邏輯(例如,爲什麼「Id。」出現在空字符串之前)。同時說明如果使用XSLT 1.0或2.0。 –

+0

我無法控制id的命名約定。例如,該值僅作爲「Id。4.3」給出,因此我需要弄清楚如何對其進行分類。我目前的邏輯爲排序id值只有數字(1.1,1.2,1.3)。我不知道如何在添加「ID」時對其進行排序。我正在使用XSLT 2.0 – albinosilver

+0

這不能回答我的問題。如果你只想按數字排序,那麼「1.3」應該在「4.3」之前。我們需要一些規則,而不僅僅是一個例子。 –

回答

2

顯示您可以通過使用來完成的順序:

<xsl:sort select="number(starts-with(@id, 'Id. '))" data-type="number" order="descending"/> 
<xsl:sort select="substring-before(replace(@id, '^Id. ', ''), '.')" data-type="number"/> 
<xsl:sort select="substring-after(replace(@id, '^Id. ', ''), '.')" data-type="number"/> 

這可能可以通過使用collation屬性來簡化(它也可以處理編號方案中的更多級別,例如, 「1.10.2」) - 但是,這取決於您使用的處理器。

2

XSLT 3.0定義覈對URI爲這樣:

<xsl:sort collation="http://www.w3.org/2013/collation/UCA?numeric=yes"/> 

此治療的數字的任何序列爲一個數字,所以2.20(A)-3排序前2.20的(a)-10和2.8後(二)-4。

但是這個(我認爲)會在「1.3」之後加上「id。4.10」。爲了解決這個你需要與其他排序鍵

<xsl:sort select="not(starts-with(., 'id'))"/> 

(假種前真)

這在當前撒克遜實現釋放它前面。早期的撒克遜版本提供整理URI:

http://saxon.sf.net/collation?alphanumeric=yes 

具有類似的語義。

如果這對您不適用,那麼如果您始終具有相同數量的數字組件,則可以使用正則表達式分割該值並使用多個排序鍵。

相關問題