Xml 如何在XPath/XQuery中返回多个元素集?我可以将复杂的文档URL保存到变量中吗?
我刚刚开始学习XPath和XQuery子集,以便像SQL数据库一样查询和解析XML文档集 我的第一个问题是,如何轻松地为特定查询返回多个相关元素 例如,下面是我的XPath查询示例: docXXXfakeURL.xml?用户=用户名;pwd=mypassword//schedule[employee id=1425,activity id=2058]/开始时间 这将打开一个特定的XML文档,查找具有特定员工和活动的schedule元素,并返回元素time start 但是,如果我想从该节点返回多个子元素,该怎么办?比如,不仅是时间的开始,还有时间的结束,工作组,其他的东西,等等。我不想再键入整个路径 现在,我发现我可以做[verbose query]/node[position=4或position=7] 这通过一些可能不理想的代码返回多个位置的节点,我必须查找这些节点,而不是简单地返回多个元素 我的另一个问题是,我是否可以将URL名称存储在XML中的变量中 比如说我经常引用doclocolhost:8888/schedule/1032/employees/3230/planninggroup/2014.xml?user=johnsmith&pwd=mysecretpassword 有没有办法将该文档存储在变量中?或者至少缩短它Xml 如何在XPath/XQuery中返回多个元素集?我可以将复杂的文档URL保存到变量中吗?,xml,xpath,xquery,Xml,Xpath,Xquery,我刚刚开始学习XPath和XQuery子集,以便像SQL数据库一样查询和解析XML文档集 我的第一个问题是,如何轻松地为特定查询返回多个相关元素 例如,下面是我的XPath查询示例: docXXXfakeURL.xml?用户=用户名;pwd=mypassword//schedule[employee id=1425,activity id=2058]/开始时间 这将打开一个特定的XML文档,查找具有特定员工和活动的schedule元素,并返回元素time start 但是,如果我想从该节点返回多
我认为我正在查询的这个应用程序第三方应用程序可能有数百个包含数据的XML文档,所以我甚至不能重复使用一个文档URL。我的代码看起来非常混乱,因为我必须调用一个巨大的URL文档来获取员工列表,另一个巨大的URL文档来获取日程安排,另一个用来确定每个人都在哪个办公室工作,我不确定为什么不把它放在一个文档中。我不确定我是否完全理解您的意图,但让事情变得更简单的一种方法是编写小型可重用函数:
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函数可以默认为那些本地主机:8888、1032、3230等,然后其他2-、3-等。param函数可以选择性地覆盖它们
要使用XPath返回多个节点,可以使用parens:
doc(...)//schedule[...]/(time-start | time-end | work-group)
如果要从该节点返回多个子元素,该怎么办?比如,不仅是时间的开始,还有时间的结束,工作组,其他的东西
将EXPR/time start替换为
比如说我经常引用doclocolhost:8888/schedule/1032/employees/3230/planninggroup/2014.xml?user=johnsmith&pwd=mysecretpassword
有没有办法将该文档存储在变量中
在XQuery和XPath3.0中,您可以编写
let $doc := doc("long uri here")
return $doc/a/b/c/d
在XPath 2.0中,可以为此滥用for表达式:
for $doc in doc("long uri here")
return $doc/a/b/c/d
for $doc in doc("long uri here")
return $doc/a/b/c/d