4

我有 2 个 XML 文件:

文件1.xml

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

文件2.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: cannot convert 'xs:boolean(true)' to xs:integer

4

3 回答 3

10

这可能会有所帮助:

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

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

contains('abc', 'a') ► true
于 2012-12-20T20:40:59.290 回答
3

包含仅适用于字符串。(尽管在您的示例中,它似乎将节点转换为字符串,但随后失败,因为它返回您无法与 0 比较的布尔值。)

你可以做

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

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

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

于 2012-12-20T20:17:52.120 回答
0

这对我有用:

fn:exists($data[. =($data2/text())])
于 2014-04-21T16:29:04.917 回答