Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml xquery order by,结果来自fn replace_Xml_Xquery_Xquery 3.0 - Fatal编程技术网

Xml xquery order by,结果来自fn replace

Xml xquery order by,结果来自fn replace,xml,xquery,xquery-3.0,Xml,Xquery,Xquery 3.0,我根据XML元素的内容对搜索结果进行排序(来自许多XML文件)。棘手的是,我只需要根据在这个元素中找到的字符串的一部分对结果进行排序,即字符串“Rep.”后面的数字。例如,“BPH,Rep.49,Ti No.22”应位于“I.HA Rep.100,Nr.2233”之前。我使用正则表达式用fn:replace隔离子字符串。正则表达式绝对正确,它每次都能吐出正确的数字。但由于某些原因,它不能正确订购。我错过了什么?谢谢一个新手 XML如下所示: <xml> <idno>I.

我根据XML元素的内容对搜索结果进行排序(来自许多XML文件)。棘手的是,我只需要根据在这个元素中找到的字符串的一部分对结果进行排序,即字符串“Rep.”后面的数字。例如,“BPH,Rep.49,Ti No.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>
  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

如果我将我的“orderby”更改为一些简单的东西,比如,不使用regex而按不同的元素进行排序,那么它是有效的。我搞不懂它是怎么订购的。我们谈论的是成千上万的IDNO,我不知道它是按什么模式订购的。如果有人需要更多的例子,我可以在列表中添加更多内容。谢谢

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

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

如果$records是一系列
元素,那么$record是
元素,$record//idno将不选择任何内容;您应该只参考
$record

谢谢您的评论。对不起,我没有提到XML实际上是complexer,我在这里简化了它,并删除了除“idno”之外的所有父元素等。Daniel Haley发现了错误-fn:replace的结果是一个字符串,因此我需要fn:number,以便“order by”知道将结果像数字一样排序(如果我理解正确的话)。