0

我知道如何使用 For 指令在集合或文档上创建循环,但我无法在 item()* 上创建循环

item()* 的内容:

<Placemark>
    <blabla id="1">
        <value>abcd</value>
    </blabla>
    <blabla id="2">
        <value>abcd</value>
    </blabla>
    ...
</Placemark>
<Placemark>
    ...
</Placemark>

现在我只需要例如<blabla>元素。使用文档上的经典循环,我可以这样访问:

for $x in doc("/db/data.xml")/Placemark
return $x

但是在 item()* 上有一个循环,它不会像这样工作:

declare function local:fct($content as item()*) as item()* {
    for $x in $content/Placemark
    return $x
};

我没有错误,只是一个空白的结果。有人知道为什么它不起作用吗?

4

2 回答 2

2

因为您的循环已经在迭代Placemark项目,所以您的解决方案要求 的Placemark子级Placemark,它是空的。

declare function local:fct(
  $content as element(Placemark)*
) as element(blabla)* {
    for $x in $content
    return $x/blabla
};
于 2013-07-03T18:24:29.923 回答
0

如果您将 Placemark 元素的父元素作为 $content 参数的值传递给函数,那么您的代码就可以了。但看起来好像您正在使用类似 的表达式调用该函数local:fct(doc(...)//Placemark),这意味着 $content 序列的成员本身就是 Placemark 元素。然后,您的函数会询问他们的 Placemark 子代;没有,所以你得到的是空序列。

wst建议的修改功能是解决问题的好方法;将 Placemark 元素的父元素作为 $content 的值传递将是另一种好方法。

于 2013-07-03T18:55:21.277 回答