xquery order by with 结果来自 fn replace

xquery order by with results from fn replace

我正在根据 XML 元素的内容对搜索结果(来自许多 XML 文件)进行排序。棘手的是我需要仅根据在此元素中找到的字符串的一部分对结果进行排序,即字符串 'Rep.' 后面的数字。例如 'BPH, Rep. 49, T I Nr. 22' 应该在 'I. HA Rep. 100, Nr. 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+)(.*)', '')
  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,我无法弄清楚它据称对它们进行排序的模式。如果有人需要更多示例来弄清楚,我可以在列表中添加更多内容。谢谢!!!!

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

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

如果 $records 是 <idno> 元素的序列,那么 $record 就是一个 <idno> 元素,而 $record//idno 将 select 什么都没有;你应该只参考 $record.