在XQuery中获取XML文档的位置

时间:2009-08-03 13:40:42

标签: xml xquery

我正在使用Oxygen XML来处理包含对其他XML文件的引用的XML文件。这些其他XML文件存储在包含主XML文件的目录的子目录中。

Downloads/
directory1/
  main.xml
  subdirectory1/
    other1.xml
    other2.xml

其他XML文件的位置存储为主文件中的相对链接。我的查询看起来像这样:

for $df in /clldata/DiscussionForums/DiscussionForum
    let $href := replace(data($df/@href),"\\","/")
    for $p in doc($href)
return $p

我遇到的问题是Oxygen使用xquery文件的路径作为相对路径的基础,显然导致文件未找到错误。如何在查询中获取XML文档的路径?

现在我只是使用concat()来添加正确的路径,但我希望它可以轻松重用。

2 个答案:

答案 0 :(得分:2)

您需要解析相对于主XML文档的URI的URI。在您的情况下,您可能想要执行以下操作:

let $href = resolve-uri($d/@href, base-uri($d))

这里,base-uri($ d)函数获取包含相关DiscussionForum节点的源文档的绝对URI,而resolve-uri正在解析相对于此的新URI。

这适用于我在jedit XQuery插件上使用SAXON。 YMMV,我从未使用过Oxygen XML。

答案 1 :(得分:0)

我认为以下XPath表达式应选择所有链接的文档:

/clldata/DiscussionForums/DiscussionForum/@href/doc(resolve-uri(., base-uri(.))

因此,您应该能够像这样找到所有找到的文档上的任何xml元素:

/clldata/DiscussionForums/DiscussionForum/@href/doc(resolve-uri(., base-uri(.))
/path/to/the/element/you/want/to/find/in/all/documents/@name

如果您更喜欢FLOWR样式表达式,则应执行以下操作:

for $doc in /clldata/DiscussionForums/DiscussionForum/@href/doc(resolve-uri(., base-uri(.))
where $doc/some/criteria='select'
return $doc/path/to/the/element/you/want/to/find/in/all/documents/@name