Parentless attribute nodes and namespaces, text says it is disallowed, processors appear to allow it

I was wondering if the statement we have about parentless attribute nodes is still valid. Under 5.8 Sequence Constructors we say:

<quote>
Parentless attribute nodes require particular care because they have no namespace nodes associated with them. A parentless attribute node is not permitted to contain namespace-sensitive content (for example, a QName or an XPath expression) because there is no information enabling the prefix to be resolved to a namespace URI. Parentless attributes can be useful in an application (for example, they provide an alternative to the use of attribute sets: see 10.2 Named Attribute Sets) but they need to be handled with care.
</quote>

For instance, if I write something like this:

<xsl:template match="x">
   <xsl:copy>
     <xsl:variable name="attr" as="attribute()">
        <xsl:attribute name="test" namespace="urn:myns" />
     </xsl:variable>
     <xsl:copy-of select="$attr" />
   </xsl:copy>
</xsl:template>

It creates <x ns1:test="" xmlns:ns1="urn:myns" />

I doubt it should fail as the test suggests. When I try this with several processors, they all create a new namespace node with the URI of the namespace attribute and place the new attribute in that namespace. This seems reasonable, but if we allow that as a proper status-quo-in-the-wild (tested in XSLT 2.0 and 3.0), then perhaps we should reconsider that Note. Or am I misinterpreting it?

Also, what is meant by "or an XPath expression"? A namespace node does not *contain* an XPath expression.

The above variable $attr does return a namespace with fn:namespace-uri(), a QName with fn:name() and a local name with fn:local-name(). I cannot use fn:in-scope-prefixes() (requires an element) but I can see the prefix with fn:name().

This looks to me like a contradictio-in-terminus...

Cheers,
Abel

Received on Wednesday, 23 September 2015 19:30:39 UTC