xquery - 用于正则表达式的函数tokenize

时间:2013-12-03 12:08:42

标签: xml regex xquery tokenize

我已使用正则表达式修改了我的代码,但我遇到了fn:tokenize的问题。这是我的xml文件的一部分:

<radix>
...
<EV>
  <accoppiamenti>
     <accoppiamento specie="e01" />
  </accoppiamenti>
</EV>
  <accoppiamenti>
     <accoppiamento specie="e00" />
     <accoppiamento specie="e01" />
     <accoppiamento specie="e02" />
  </accoppiamenti>
</EV>
...
</radix>

这是我的文件xquery的一部分,其中包含tokenize:

for $ev in $snapshot/EV
let $stringa := $ev/accoppiamenti//accoppiamento/@specie
return(
    fn:tokenize($stringa,"e")        
)

预期输出为01 00 01 02,但有效输出为0100(无空格)。 有什么麻烦?谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

Tokenize可能很有用,但需要一次应用于单个值。不确定为什么eXistDB似乎在输出之前将数据转换为数字。在你的情况下,你真的不需要令牌化。较旧的逐字符替换函数fn:translate()也会这样做。如果您想确保结果以空格分隔,请尝试将for包装在fn:string-join()

fn:string-join(
  for $a in $snapshot/EV/accoppiamenti//accoppiamento/@specie
  return
    fn:translate($a,"e", ""),
" ")

如果你想颠倒事物的顺序,只需在fn:reverse()中包装for,然后再串联连接所有内容。如果要分别迭代每个EV中的specie属性,可以嵌套for循环。

HTH!

答案 1 :(得分:1)

如果你想坚持fn:tokenize(...)(尽管@ grtjn的答案可能更有效),你需要将函数应用于每个元素,例如在节点步骤中:

for $ev in $snapshot/EV
return $ev/accoppiamenti//accoppiamento/fn:tokenize(@specie,"e")