如何在XPath / XQuery中获取所有后代?

时间:2011-06-29 16:59:14

标签: xml xpath xquery

我正在尝试浏览文档以了解其结构。该文档正在向我提供,因此我无法访问原始文档,但我可以对服务器进行查询。我相信它是无架构的。我通过作为MarkLogic一部分的CQ Web应用程序访问该文档。

我基本上想让一棵完全填充的树归还给我。这似乎很容易,但尚未证实。我查看了W3C和其他几个网站,似乎没有任何工作。

由于式提前,

3 个答案:

答案 0 :(得分:7)

也许文档太大而无法返回 - 如果您正在使用MarkLogic,也许您正在尝试查询数千或数百万个子文档的“森林”?

了解文档结构而不尝试返回所有文档的好方法是使用连续的XPath查询来为您提供元素的名称。 E.g。

name(/*)

这将告诉您最外层元素的名称。然后,

name(/*/*[1]) <!-- name of first child of outermost element -->
name(/*/*[2])

/*/text()[1]  <!-- content of first text node under outermost element -->

count(/*/*)   <!-- number of children of outermost element -->

name(/*/@*[1]) <!-- name of first attribute of outermost element (untested) -->

由于您可以使用XQuery,您可以执行一个循环,打印出文档前三个级别的前三个元素的所有上述数据。

或者,/可能不返回任何内容,因为在XPath中这意味着“包含上下文节点的文档的根节点”;在XQuerying XML文档数据库中,可能还没有上下文节点(警告:我在XQuery中不是很流利,所以请检查你的引用)。相反,您可能必须使用document('...')/启动XPath表达式;希望你知道文件的名称吗?

此外,this screenshot显示了一些可能有用的查询。我想。

答案 1 :(得分:1)

@LarsH推荐了一种有用的探索策略。

另一种方法是获取整个XML文档,例如应用XSLT标识转换:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

</xsl:stylesheet>

此转换生成一个XML文档,在大多数情况下,该文档与应用它的源XML文档(任何XML文档)相同。

查看确切XML文档的另一种方法是使用调试器并在已接收XML文档的代码中的某个位置设置断点。然后使用debugger visualization capabilitis获取XMLDocument对象的“outerxml”或“innerxml”属性。

当然,没有什么能阻止服务器在不同的请求上返回不同的XML文档。

答案 2 :(得分:0)

由于您使用的是CQ,因此可以单击“浏览”链接(位于查询窗格的左上角)。这将为您提供所选数据库中的文档列表。然后,您可以使用其中一个文档的URI并执行它的fn:doc:

fn:doc("/myuri.xml")

那将返回那个文件。然后,您可以添加XPath步骤以向下导航。