XML doesn't allow you to bind a prefix to the thing-that-is-not-a-namespace.
With XML namespaces 1.1, the declaration xmlns:x="" doesn't bind x to anything, it unbinds x. Within the scope of this (un)declaratiion, the prefix x cannot be used. It makes sense for XQuery to do the same thing. The rules are in ยง3.9.1.2: If the namespace URI is a zero-length string and the implementation supports [XML Names 1.1] <https://www.w3.org/TR/xquery-31/#XMLNAMES11>, any existing namespace binding for the given prefix is removed from the in-scope namespaces <https://www.w3.org/TR/xquery-31/#dt-in-scope-namespaces> of the constructed element and from thestatically known namespaces <https://www.w3.org/TR/xquery-31/#dt-static-namespaces> of the constructor expression. If the namespace URI is a zero-length string and the implementation does not support [XML Names 1.1] <https://www.w3.org/TR/xquery-31/#XMLNAMES11>, a static error is raised [err:XQST0085 <https://www.w3.org/TR/xquery-31/#ERRXQST0085>]. It isimplementation-defined <https://www.w3.org/TR/xquery-31/#dt-implementation-defined> whether an implementation supports [XML Names] <https://www.w3.org/TR/xquery-31/#XMLNAMES> or [XML Names 1.1] <https://www.w3.org/TR/xquery-31/#XMLNAMES11>. Michael Kay Saxonica > On 2 Apr 2018, at 20:00, Joe Wicentowski <[email protected]> wrote: > > Hi all, > > A common question for beginners is how to access empty namespaced elements in > non-empty contexts. The easiest answer is to use a wildcard. For example, > we use one here inside the curly braces: > > let $x := <x><y/></x> > return > <z xmlns="foo">{ $x/*:y }</z> > > As expected, this query returns: > > <z xmlns="foo"><y xmlns=""/></z> > > The other method I know of is to use the URI-qualified name: > > let $x := <x><y/></x> > return > <z xmlns="foo">{ $x/Q{}y }</z> > > A third method occurred to me, but it does not work, and I haven't been able > to pin down the reason despite reading the spec. The idea is to bind the > empty namespace URI to a namespace prefix, e.g., "my": > > declare namespace my=""; > > let $x := <x><y/></x> > return > <z xmlns="foo">{ $x/my:y }</z> > > In BaseX, eXist, and Saxon, this returns err:XPST0081 > (https://www.w3.org/TR/xquery-31/#ERRXPST0081 > <https://www.w3.org/TR/xquery-31/#ERRXPST0081>). The location of the error > points to the step, "my:y" on the final line. > > Can anyone enlighten me on the reason this 3rd method is invalid? Bonus > points for an explanation that includes why I cannot bind a namespace prefix > to the empty namespace, but I can access it via *: and Q{}? > > Thanks, > Joe > _______________________________________________ > [email protected] > http://x-query.com/mailman/listinfo/talk
_______________________________________________ [email protected] http://x-query.com/mailman/listinfo/talk
