我刚刚开始学习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文档,另一个用于确定每个人在哪个办公室工作----为什么这不仅仅是一个文件,我不确定。
答案 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, "&pwd=", $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