- From: Michael Kay <mhk@mhk.me.uk>
- Date: Fri, 29 Sep 2006 13:57:18 +0100
- To: <egil@wp.pl>, <xsl-editors@w3.org>
> Sorry to bother you, but one part of the recommendation is > not really clear to me. I'm not sure about this statement in > the copy-of: > > > When the result is a node-set, all the nodes in the set are > copied in > > document order into the result tree; copying an element node copies > > the attribute nodes, namespace nodes and children of the > element node > > as well as the element node itself... > > What does it mean to copy namespace nodes? It means that when you copy an element E that has three in-scope namespaces, say xmlns:a="http://a/", xmlns:b="http://b/", and xmlns="http://c/" (plus the XML namespace which is always in scope), then the copy of the element will also have those three namespaces in scope. > > I'll give you an example of what troubles me here. Below you > have a simple XML document > > <?xml version="1.0" encoding="UTF-8"?> > <?xml-stylesheet type="text/xsl" href="test.xsl" ?> <document> > <svg> > <circle cx="30" cy="10" r="5" /> > </svg> > </document> There are no namespaces in this document, other than the XML namespace which is always present. So copy-of when applied to the <circle> element creates an element which has no namespace nodes (again except for the XML namespace). (stylesheet abbreviated to:) <svg width="200px" height="200px"> <circle cx="10" cy="10" r="5" /> <xsl:copy-of select="//svg/circle" /> </svg> > > This should give me an XML document: > > <svg xmlns="http://www.w3.org/2000/svg" width="200px" height="200px"> > <circle cx="10" cy="10" r="5"/> > <circle cx="30" cy="10" r="5"/> > </svg> No, it shouldn't: see below. > > So is this an error to consider the second (copied) circle to > be in the SVG namespace? To put it in another way: what is > the namespace of the copied element - the one defined in the > XML document or in the XSL document? This has nothing to do with copying of namespace nodes. When an element is copied, the copy has the same expanded name as the original element. The expanded name of the copied circle element is (local name = circle, namespace = null). So the circle element in the result document will not be in the SVG namespace, it will be in the "null" namespace. This means it must be serialized as: <svg xmlns="http://www.w3.org/2000/svg" width="200px" height="200px"> > <circle cx="10" cy="10" r="5"/> > <circle xmlns="" cx="30" cy="10" r="5"/> > </svg> > It would be quite natural to me if the resulting document > would be treated as if it would be like that all the time, > but as both Opera and Firefox display only one circle, then > I'm not sure if this is a bug on there side or am I wrong here? > I can't comment on particular products but there is no doubt what the correct result of this transformation is. Copying an element never changes its name. If you want to create an element in a different namespace from the original, you need to use <xsl:element> rather than <xsl:copy-of>. Could I suggest that in future, the best place to ask questions about interpretation of the XSLT language is the xsl-list at mulberrytech.com. You will almost always get a good answer to your question, especially if it's one (like this) that is frequently asked. Regards, Michael Kay (personal response)
Received on Friday, 29 September 2006 12:57:31 UTC