BaseX 8.2 中带有元素节点测试的 XQuery 文档节点测试会在根元素之前出现注释时抛出异常。为什么?

XQuery document node test with an element node test in BaseX 8.2 throws in the presence of comments before the root element. Why?

在 BaseX 8.2 中,我尝试将其分配给 XQuery 变量,这是一个根元素具有特定名称的文档节点。来源 XML 如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!--A comment-->
<myRootElement/>

为了获取文档节点,我使用 DocumentTest:

对其进行类型检查
declare variable $docnode as document-node(element(myRootElement)) := doc("pathToSourceFile");

但是,我收到以下错误消息:XPTY0004:无法将文档节点() 视为文档节点(document-node()(myRootElement))...

这是完全出乎意料的,因为如果在根元素 之前没有注释,赋值就会成功。这意味着注释的存在会使查询失败。

但是,这不是预期的行为,除非 XQuery 在这方面的行为不同于 XSLT(如果是这种情况,请告诉我)。在 XSLT 中,根据 Michael Kay(第 671 页¶6 XSLT 2.0 和 XPath 2.0 第 4 版)DocumentTest 检查以下内容:

The document node must be the root of a tree that corresponds to a well-formed XML document. Specifically this means that the document node must have exactly one element node, and no text nodes, among its children. It is allowed to have comments and processing instructions before or after the element node.

事实上,在 Saxon 上使用相同输入 XML 的以下转换效果很好:

<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  <xsl:output method="xml" encoding="utf-8"/>

  <xsl:template match="/">
    <xsl:variable name="docnode" as="document-node(element(myRootElement))" select="."/>
    <xsl:value-of select="$docnode/*/name(.)"/>
  </xsl:template>

</xsl:transform>

变量docnode赋值成功,输出为:

<?xml version="1.0" encoding="utf-8"?>myRootElement

那么,为什么 DocumentTestElementTest 在 XML 文档上带有评论,然后根元素起作用在 Saxon 中,而不是在 BaseX 中?也许,我对 XQuery 有新的了解。

如评论中所述,您做对了一切。该错误已在 latest 8.2.1 snapshot 中解决。感谢您报告此事。