为什么在xsl:variable中存储属性导致错误XTDE0420?

时间:2015-05-04 21:54:41

标签: xml xslt xslt-2.0

此XSLT构造属性并将结果存储在变量中。然后将变量复制为元素<test>的唯一子元素:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all">    

  <xsl:template match="/">        
    <xsl:variable name="some-attribute">
      <xsl:attribute name="test">value</xsl:attribute>
    </xsl:variable>
    <test>
      <xsl:copy-of select="$some-attribute" />
    </test>
  </xsl:template>

</xsl:stylesheet>

虽然这似乎只是将一个属性作为元素的子元素插入,但结果是抛出一个错误:XTDE0420: Cannot create an attribute node whose parent is a document node

1 个答案:

答案 0 :(得分:7)

关键信息在section 9.3 of the XSLT 2.0 spec, "Values of Variables and Parameters"中解释:

  

如果变量绑定元素没有select属性且具有   非空内容(即变量绑定元素有一个或   更多的子节点),并没有as属性,那么内容   variable-binding element指定提供的值。 的内容   变量绑定元素是一个序列构造函数; 一份新文件   由一个文档节点构建作为其子节点   通过评估序列得到的节点序列   构造函数,然后应用5.7.1构造中给出的规则   复杂内容。然后变量的值是单例   包含此文档节点的序列。有关详细信息,请参阅   9.4创建隐式文档节点。

基本上,没有select属性且没有as属性的变量的值是文档节点。

无法修改示例中的变量以使用select,但可以将其更改为使用as

<xsl:variable name="some-attribute" as="item()*">
  <xsl:attribute name="test">value</xsl:attribute>
</xsl:variable>