2

我正在根据 XML 元素的内容对搜索结果(来自许多 XML 文件)进行排序。棘手的是我只需要根据在此元素中找到的字符串的一部分对结果进行排序,即字符串“Rep.”后面的数字。例如'BPH, Rep. 49 , TI Nr. 22'应该出现在'I'之前。HA 众议员100号,编号 2233'。我使用正则表达式用 fn:replace 隔离子字符串。正则表达式绝对正确,它每次都吐出正确的数字。出于某种原因,它不会正确订购。我错过了什么?来自新手的感谢。

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

如果我将我的“排序依据”更改为简单的东西——比如,在不使用正则表达式的情况下按不同的元素排序——它就可以工作。我不知道它是如何订购的。我们正在谈论数以千计的 idno,我无法弄清楚它应该按照什么模式来订购它们。如果有人需要更多示例来弄清楚,我可以在列表中添加更多内容。谢谢!!!!

4

2 回答 2

2

我无法使用您的输入和示例 XQuery 进行测试,但请尝试replace()包装number()...

order by number(replace($record, '(.*Rep\.\s)(\d+)(.*)', '$2'))
于 2016-12-28T14:14:26.010 回答
0

如果 $records 是一个<idno>元素序列,那么 $record 是一个<idno>元素并且 $record//idno 将不选择任何内容;你应该只是参考$record

于 2016-12-28T16:07:36.080 回答