在BaseX 8.2中使用元素节点测试的XQuery文档节点测试会在根元素之前出现注释。为什么?

时间:2015-06-06 18:25:14

标签: xml xslt xquery saxon basex

在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()视为文档节点(document-node()(myRootElement))...

这是非常意外的,因为如果在根元素&lt; myRootElement&gt;之前没有评论,作业成功。这意味着注释的存在会使查询失败。

然而,这不是预期的行为,除非XQuery在这方面的行为与XSLT不同(如果是这种情况,请告诉我)。根据Michael Kay的说法,在XSLT中(p.671¶6XSLT 2.0和 XPath 2.0 4th Ed。) DocumentTest 检查以下内容:

  

文档节点必须是对应于格式良好的XML文档的树的根。   具体而言,这意味着文档节点必须只有一个元素节点,而没有文本   节点,其子节点。允许在或之前有评论和处理说明   在元素节点之后。

事实上,对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

那么,为什么带有 ElementTest DocumentTest 在带有注释的XML文档之前,根元素在Saxon中工作,而不是在BaseX中?也许,我有一些新东西可以学习XQuery。

1 个答案:

答案 0 :(得分:1)

如评论所示,你把一切都弄好了。该错误已在latest 8.2.1 snapshot中得到解决。感谢您报告此事。