XQuery:如果列表包含给定的字符串,如何尝试?

时间:2012-12-20 20:09:06

标签: xml xquery contains

我有2个XML文件:

file1.xml

<data>doe90</data>
<data>foo</data>
<data>goo</data>
...

file2.xml

<data2>nan</data2>
<data2>goo</data2>
<data2>test</data2>
...

我将这些数据存储在2个变量中:

let $data := //data,
$data2 := //data2

并开始这样做:

for $d in $data2
return 
if() (: $d is also in $data ? :)

我该怎么办?感谢

编辑:当然我试过包含,但收到错误:

if(contains($d,$data) = 0)
  

查询执行期间发生异常:XPTY0004:无法转换   'xs:boolean(true)'到xs:integer

3 个答案:

答案 0 :(得分:8)

这可能有所帮助:

//data[. = //data2] ► returns elements whose string values are contained in data2 
//data = //data2    ► returns true there are any matches, false otherwise

fn:contains()在这里没有帮助,因为它是为匹配substrings而构建的:

contains('abc', 'a') ► true

答案 1 :(得分:3)

仅包含字符串。 (虽然在你的例子中它似乎将节点转换为字符串,但随后失败,因为它返回了无法与0比较的布尔值。)

你可以做到

if (exists(index-of($data, $d)))

并且

$data2[exists(index-of($data, .))] 

可能比for / if-(但仍然是n ^ 2)

更快

答案 2 :(得分:0)

这项工作对我来说:

fn:exists($data[. =($data2/text())])