在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。