我有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
答案 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())])