- From: Erik Bruchez <erik@bruchez.org>
- Date: Tue, 2 Dec 2014 18:15:24 -0800
- To: Forms WG <public-forms@w3.org>, "public-xformsusers@w3.org" <public-xformsusers@w3.org>
All, As discussed during our November 12 call [1]: - One way (and the way I prefer) to look at the issue is to deal with namespaces when the data model is created rather than at submission time. - The issue arises only when "the initial instance data is given by inline content". The current text is pretty clear that all namespaces which are in scope on the <xf:instance> element are copied over to the data model: "If the initial instance data is given by inline content, then instance data is obtained by first creating a detached copy of the inline content (including namespaces inherited from the enveloping ancestors), then creating an XPath data model over the detached copy. The detached copy must consist of content that would be well-formed XML if it existed in a separate document. Note that this restricts the element content of instance to a single child element." One possibility would be to: - remove the text "including namespaces inherited from the enveloping ancestors" - add the following text: "Namespace nodes in scope on the enclosing <xf:instance> are not copied to the detached copy, except namespace nodes which map prefixes which are in use by elements or attributes contained within the data model." The principles are as follows: - copy the minimum amount of namespace nodes - only copy namespace nodes to the root element - following XSLT, only consider element and attribute names (other uses of namespaces, e.g. in attribute values, are not guessed) - if users actually need more namespaces in scope, they place it on the root element This means that simple copy/paste of XML content under <xf:instance> will work. Here are a few examples: <!-- Example 1: No namespaces copied --> <xh:html xmlns:xh="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:foo="http://example.org/foo" xmlns:bar="http://example.org/bar"> <xh:head> <xf:model> <xf:instance> <form> <first-name/> </form> </xf:instance> </xf:model> </xh:head> </xh:html> <!-- Resulting data model --> <form> <first-name/> </form> <!-- Example 2: Namespaces in use are copied --> <xh:html xmlns:xh="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:foo="http://example.org/foo" xmlns:bar="http://example.org/bar"> <xh:head> <xf:model> <xf:instance> <form> <foo:first-name/> <last-name bar:baz=""/> </form> </xf:instance> </xf:model> </xh:head> </xh:html> <!-- Resulting data model --> <form xmlns:foo="http://example.org/foo" xmlns:bar="http://example.org/bar"> <foo:first-name/> <last-name bar:baz=""/> </form> <!-- Example 3: Shadowed namespace prefix is not considered in use --> <xh:html xmlns:xh="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:foo="http://example.org/foo" xmlns:bar="http://example.org/bar"> <xh:head> <xf:model> <xf:instance> <form> <foo:bar xmlns:foo="http://dummy.org/foo"/> </form> </xf:instance> </xf:model> </xh:head> </xh:html> <!-- Resulting data model --> <form> <foo:bar xmlns:foo="http://dummy.org/foo"/> </form> <!-- Example 4: Namespace prefixes not used in element and attribute names are not considered in use --> <xh:html xmlns:xh="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:foo="http://example.org/foo" xmlns:bar="http://example.org/bar"> <xh:head> <xf:model> <xf:instance> <form xmlns:baz="http://example.org/baz"> <expression value="foo:a/bar:b/baz:c"/> </form> </xf:instance> </xf:model> </xh:head> </xh:html> <form xmlns:baz="http://example.org/baz"> <expression value="foo:a/bar:b/baz:c"/> </form> <!-- Example 5: User can work around this by placing namespace declarations on root element --> <xh:html xmlns:xh="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:foo="http://example.org/foo" xmlns:bar="http://example.org/bar"> <xh:head> <xf:model> <xf:instance> <form xmlns:foo="http://example.org/foo" xmlns:bar="http://example.org/bar" xmlns:baz="http://example.org/baz"> <expression value="foo:a/bar:b/baz:c"/> </form> </xf:instance> </xf:model> </xh:head> </xh:html> <form xmlns:foo="http://example.org/foo" xmlns:bar="http://example.org/bar" xmlns:baz="http://example.org/baz"> <expression value="foo:a/bar:b/baz:c"/> </form> This change can be done in two ways: 1. In a backward-incompatible way, whereby we change the default behavior. 2.In a backward-compatible way, where an attribute is needed to obtain the new behavior: <xf:instance copy-namespaces="false"> ... </xf:instance> Thoughts welcome, -Erik [1] http://www.w3.org/2014/11/12-forms-minutes.html [2] http://www.w3.org/TR/xslt-30/#element-copy
Received on Wednesday, 3 December 2014 02:16:14 UTC