xquery order by with fn replace的结果

时间:2016-12-28 14:01:21

标签: xml xquery xquery-3.0

我根据XML元素的内容对搜索结果(来自许多XML文件)进行排序。棘手的是我需要根据此元素中找到的字符串的一部分来命令结果,即字符串' Rep。'之后的数字。例如' BPH,Rep。 49 ,T I Nr。 22'应该来到我之前。 HA Rep。 100 ,Nr。 2233&#39 ;.我用正则表达式用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

如果我按照&#39;更改我的订单简单的事情 - 比如,在不使用正则表达式的情况下通过不同的元素排序 - 它的工作原理。我无法弄清楚它是如何订购的。我们正在谈论成千上万的idnos,我无法弄清楚它应该按照它们排序的模式。如果有人需要更多示例来解决这个问题,我可以在列表中添加更多内容。谢谢!!!!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

如果$ records是<idno>个元素的序列,则$ record是<idno>元素,$ record // idno将不会选择任何内容;你应该参考$record