2012-02-06 101 views
2

我是xquery的新手,我正尝试使用集合来重新加载我的网页并保留一些信息。我的问题是在创建集合并使用(sausalito)保存节点之后,即使在关闭程序之后,集合仍然保持活动状态。下次我使用集合时,它已经有节点了。我只需要收集节点,然后重新加载网站和删除节点。问题是我无法删除集合或节点。我试着使用删除节点()等方法从http://www.zorba-xquery.com/doc/zorba-1.4.0/zorba/xqdoc/xhtml/www.zorba-xquery.com_modules_xqddf.html#delete-index-1XQUery集合:删除?

我有什么

declare collection resultview:collection as node()*; 
declare variable $resultview:collection as xs:QName := xs:QName("resultview:collection"); 
declare sequential function resultview:add($allMovies as element(movies)) 
{ 
for $movie in $allMovies 
return xqddf:insert-nodes($resultview:collection, $allMovies); 
fn:trace(xqddf:collection($resultview:collection), "Collection data: "), 
exit returning resultview:list(); 
}; 
declare sequential function resultview:deleteList() { 
    let $a := "" 
    return xqddf:delete-index($resultview:collection); 
    exit returning resultview:list(); 
}; 
+0

不知道我理解你的问题。你是否说你正在使用这个集合来收集一次结果(例如,只是为了这个请求)?如果是这样,为什么要使用持久集合,而不仅仅是内存序列呢?作为参数传递,应该工作得很好.. – grtjn 2012-02-06 14:37:06

+0

这是我的第一个方法,但它没有奏效。网页呈现,然后点击一个链接,重新加载并设置不同的顺序。问题是,它第一次渲染后,我如何发送参数而不保存它们?我需要将所有初始参数保存在某处,然后我想到了这一点。 (在这里也是新的) – Juan 2012-02-06 15:00:34

+1

一种选择是将状态作为隐藏参数存储在网页上,并确保它们在重新加载时提交。另一种选择是将状态存储在Cookie中,但浏览器可能会拒绝它们。将它们存储在服务器端也是一个不错的选择,但要确保区分'会话'(即使没有登录),否则并发请求可能会混淆。索萨利托提供了示例代码,可以帮助进行会话,值得一看。 – grtjn 2012-02-06 19:06:13

回答

2

如果我理解正确的话,这应该工作:

declare collection resultview:collection as node()*; 
declare variable $resultview:collection as xs:QName := xs:QName("resultview:collection"); 

declare sequential function resultview:add($allMovies as element(movies)) 
{ 
    xqddf:insert-nodes($resultview:collection, $allMovies); 
    resultview:list(); 
}; 

declare sequential function resultview:deleteList() { 
    xqddf:delete-nodes(
    $resultview:collection, 
    xqddf:collection($resultview:collection)); 
    resultview:list(); 
}; 

使用删除节点,而不是的删除索引(后者删除一个完整的索引而不是特定索引位置的节点)。

这有帮助吗?