2016-12-28 33 views
2

我按照XML元素的內容對搜索結果(來自許多XML文件)進行了排序。棘手的是我需要根據在這個元素中找到的字符串的一部分來排序結果,即字符串'Rep。'後面的數字。例如'BPH,Rep。,T I Nr。 22'應該在'我'之前。 HA Rep。,Nr。 2233' 。我使用正則表達式來隔離子字符串與FN:替換。正則表達式絕對正確,它每次都吐出正確的數字。出於某種原因,它不會正確排序。我錯過了什麼?感謝一位新手。xquery排序依據來自fn的結果替換

的XML看起來是這樣的:

<xml> 
<idno>I. HA Rep. 100, Nr. 2233</idno> 
<idno>I. HA Rep. 100, Nr. 2535</idno> 
<idno>BPH, Rep. 113, Nr. 1694</idno> 
<idno>BPH, Rep. 113, Nr. 2845</idno> 
<idno>BPH, Rep. 192 NL Wittgenstein, IV, 2, 14</idno> 
<idno>BPH, Rep. 49, T I Nr. 21</idno> 
<idno>BPH, Rep. 49, T I Nr. 22</idno> 
<idno>(D) BPH, Rep. 48, Nr. 141</idno> 
<idno>(D) BPH, Rep. 48, Nr. 144</idno> 
<idno>BPH, Rep. 192, NL Wittgenstein, VI,9,7</idno> 
<idno>I. HA Rep. 178 F, Nr. 31</idno> 
</xml> 

XQuery是這樣的:

for $record in $records 
    order by replace($record//idno, '(.*Rep\.\s)(\d+)(.*)', '$2') 
    return $record//idno 

結果:

I. HA Rep. 100, Nr. 2233 
I. HA Rep. 100, Nr. 2535 
BPH, Rep. 113, Nr. 2845 
BPH, Rep. 113, Nr. 1694 
I. HA Rep. 178 F, Nr. 31 
BPH, Rep. 192, NL Wittgenstein, VI,9,7 
BPH, Rep. 192 NL Wittgenstein, IV, 2, 14 
(D) BPH, Rep. 48, Nr. 141 
(D) BPH, Rep. 48, Nr. 144 
BPH, Rep. 49, T I Nr. 21 
BPH, Rep. 49, T I Nr. 22 

期望的結果:

(D) BPH, Rep. 48, Nr. 141 
(D) BPH, Rep. 48, Nr. 144 
BPH, Rep. 49, T I Nr. 21 
BPH, Rep. 49, T I Nr. 22 
I. HA Rep. 100, Nr. 2233 
I. HA Rep. 100, Nr. 2535 
BPH, Rep. 113, Nr. 1694 
BPH, Rep. 113, Nr. 2845 
I. HA Rep. 178 F, Nr. 31 
BPH, Rep. 192, NL Wittgenstein, VI,9,7 
BPH, Rep. 192 NL Wittgenstein, IV, 2, 14 

如果我將'order by'更改爲簡單的東西 - 比如,不使用正則表達式按不同的元素排序 - 它可以工作。我無法弄清楚它是如何訂購的。我們正在談論成千上萬的idnos,而我無法弄清楚它應該按照它們排序的模式。如果有人需要更多的例子來弄清楚,我可以在列表中添加更多內容。謝謝!!!!

回答

2

我無法測試使用的輸入和樣品的XQuery,但儘量包裝replace()number() ......

order by number(replace($record, '(.*Rep\.\s)(\d+)(.*)', '$2')) 
0

如果$記錄是<idno>元素的序列,那麼$記錄是一個<idno>元素$ record // idno將不會選擇任何內容;你應該只參考$record

+0

感謝您的評論。對不起,我沒有提到XML實際上更復雜,我在這裏簡化了它,並刪除了所有的父元素等,除了'idno'。 Daniel Haley發現了錯誤--fn的結果是:replace是一個字符串,所以我需要fn:number,以便'order by'知道按照數字排序結果(如果我理解正確)。 – Lissy