XQuery不能按元素名称选择子代,可以按索引选择

时间:2019-01-14 18:40:40

标签: xml xpath xquery

我有一个XQuery查询,其中我用存储在XML中的数据创建了一个XHTML文档。 XML看起来像这样:

<document>
    <div>
        <head>name-I-should-display</head>
        <!-- more data -->
    </div>
    <div>
        <head>name-of-div-2</head>
        <!-- more data -->
    </div>
    <!-- more divs -->
</document>

在我的xquery中,我可以很好地检索XML文档:

let $mydoc := doc("my-xml-file.xml")

我可以这样获得“文档”节点:

let $rootnode := $mydoc/*[1]

但是,如果我尝试这样做:

let $rootnode := $mydoc/document

我什么也没得到。当我以第一种形式获得“文档”节点时,div的行为相同。我对XQuery还是很陌生,但是我知道它应该可以像在结构非常相似的文档中的另一个查询中那样使用。

其他信息可能会帮助您

  • 使用的程序是Linux上的BaseX 9.0.2
  • 我正在使用/name()函数来确定我是否已检索到想要的节点或检索到空
  • XML文件开头有一个XSLT样式表声明,以这种方式工作的类似文件没有一个
  • 我无法修改XML文件

可能出了什么问题?

1 个答案:

答案 0 :(得分:2)

XML文档在XHTML名称空间中是否也是XHTML文档?如果是这样,则您的XPath失败,因为它仅选择没有名称空间的元素。试试:

let $rootnode := $mydoc/*:document

此实例中的星号通配名称空间,而不通配元素名称。如果选择根,则该元素位于名称空间中。您可以使用以下方法发现名称空间的URI:

fn:namespace-uri-from-QName($mydoc/*/fn:node-name(.))

然后,您可以获取该值并将其分配给XQuery的序言中的前缀(此示例假定输出为XHTML命名空间):

declare namespace xh="http://www.w3.org/1999/html";

使用前缀,您可以更具体地使用XPath选择想要的元素:

let $rootnode := $mydoc/xh:document