如何在XPath / XQuery中返回多个元素集?我可以将复杂的文档URL保存到变量中吗?

时间:2014-09-25 15:19:55

标签: xml xpath xquery

我刚刚开始学习XPath和子集XQuery,以便查询和解析与SQL数据库非常相似的XML文档集。

我的第一个问题是你如何 - 轻松地 - 为特定查询返回多个相关元素?

例如,这是我的一个XPath示例查询:

doc(XXXfakeURL.xml?user = username; pwd = mypassword)// schedule [employee-id = 1425 and activity-id = 2058] / time-start

这将打开某个XML文档,查找具有特定员工和活动的schedule元素,并返回元素" time-start。"

但是,如果我想从该节点返回MULTIPLE子元素,该怎么办?比如,不仅是时间开始,还有时间终点,工作组,其他东西,等等等等。我不想再次输入整条路径。

目前,我发现我可以[详细查询] / node()[position()= 4或position =(7)]。

这通过一些可能非理想的代码,返回多个位置的节点,我必须查找它,而不是简单地返回多个元素。

我的另一个问题是,我是否可以在XML中的变量中存储URL名称。

就像说我经常引用doc(" locolhost:8888 / schedule / 1032 / employees / 3230 / planninggroup / 2014.xml?user = johnsmith& amppwd = mysecretpassword")

有没有办法将该文档存储在变量中?或者至少缩短它?

我认为我查询的应用程序(第三方应用程序)可能包含数百个XML文档,这些文档构成了数据"所以我甚至可能无法重复使用一个文档URL。我的代码似乎超级杂乱,因为我必须为员工列表调用一个巨大的URL文档,为日程安排调用另一个巨大的URL文档,另一个用于确定每个人在哪个办公室工作----为什么这不仅仅是一个文件,我不确定。

2 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解你要做的事情,但让事情变得更简单的一种方法是编写可重用的小函数:

declare function local:planning-group(
  $user as xs:string,
  $pwd as xs:string
) as document-node()
{
  doc(concat(
    "localhost:8888/schedule/1032/employees/3230/planninggroup/2014.xml?",
    "user=", $user, "&amppwd=", $pwd))
};

local:planning-group("johnsmith", "mysecretpassword")

您可以通过允许您考虑URL中所有变量的方式来编写和重载函数,并且它会相当整洁。例如,如果你想要容易配置默认值,你可以将一些值存储为全局变量,然后这个2-param函数可以默认为那些(localhost:8888,1032,3230等) - 然后其他2-,3-等等param函数可以有选择地覆盖它们。

要使用XPath返回多个节点,可以使用parens:

doc(...)//schedule[...]/(time-start | time-end | work-group)

答案 1 :(得分:0)

  

如果我想从该节点返回MULTIPLE子元素怎么办?比如,不仅是时间开始,还有时间终点,工作组,其他东西,

将<{1}}替换为

EXPR/time-start
  

就像说我经常引用doc(“locolhost:8888 / schedule / 1032 / employees / 3230 / planninggroup / 2014.xml?user = johnsmith&amp; amppwd = mysecretpassword”)

有没有办法将该文档存储在变量中?

在XQuery和XPath 3.0中,您可以编写

EXPR/(time-start, time-end, work-group, other-stuff)

在XPath 2.0中,您可以为此目的“滥用”for表达式:

let $doc := doc("long uri here")
return $doc/a/b/c/d