- From: John Arwe <johnarwe@us.ibm.com>
- Date: Wed, 22 Aug 2007 10:29:31 -0400
- To: public-sml@w3.org
- Message-ID: <OFC931B7A5.7F45F85A-ON8525733F.00410D77-8525733F.004FBBB6@us.ibm.com>
[1] bugzilla http://www.w3.org/Bugs/Public/show_bug.cgi?id=4795 [2] discussion from last f2f http://www.w3.org/2007/06/12-sml-minutes.html#item06 [3a] submission text http://www.w3.org/Submission/2007/SUBM-sml-20070321/#Constraints_on_References [3b] submission text http://www.w3.org/Submission/2007/SUBM-sml-20070321/#sml_3AtargetRequired [3c] submission text http://www.w3.org/Submission/2007/SUBM-sml-20070321/#sml_3AtargetRequired2 [4a] fpwd text http://www.w3.org/TR/2007/WD-sml-20070806/#Constraints_on_References [4b] fpwd text http://www.w3.org/TR/2007/WD-sml-20070806/#sml_targetRequired [4c] fpwd text http://www.w3.org/TR/2007/WD-sml-20070806/#sml_targetRequired2 As far as I see from a cursory inspection, 3a=4a (wrt to 4a's target required content), 3b=4b, 3c=4c, 3a/3b/3c are consistent, and 4a/4b/4c are consistent. All Good Things. It is [2] that mystifies me, in that it re-draws the line. All of the 3x/4x citations above apply target required to empty, null, and dangling references. Not all of those had clear definitions at the time, so that may be the source of my mystery. [2] (and [1], its alternate form) say that we should re-define target required to apply only to dangling references, removing its current application to empty and null references. I believe our discussions about how to recognize empty and null references syntactically, coupled with lack of precise definitions for same coupled with an evolving understanding of what constitutes a valid reference scheme definition, led us down a garden path... maybe several. To the degree possible below, I am going to worry about the semantics only; once we have agreement on semantics we can worry about how to syntactically recognize each semantically unique case. Empty refs, as the minutes suggest, we were discussing in the sense of "element reference containing no content", e.g. <foo sml:ref="true" xsi:nil="true"> . As we now understand the universe of possible scheme definitions, such an element is not necessarily devoid of reference scheme content. An attribute-based reference scheme for example, <foo sml:ref="true" xsi:nil="true" my:schemeuri="/">, satisfies the definition of empty we were using yet clearly has reference scheme content. Even with element-based schemes like sml:uri, the xsi:nil="true" test fails to capture the right semantics, I assert. Using EnrolledCourse from the SML spec, if one adds sml:ref="true" to the third instance of example two then it becomes <EnrolledCourse sml:ref="true"> <Name>SocialSkills</Name> <Grade>F</Grade> </EnrolledCourse> Is this fragment an empty reference? I could say no (because xsi:nil is not true, i.e. for syntactic reasons), I could say yes (because my consumer code does not recognize any of the element's information items as matching any reference scheme definition it understands), but either way I doubt a human looking at this example would leap to the conclusion that <EnrolledCourse> is an empty reference element. This is essentially because we are engaging in a practice some call "multi-typing"; <EnrolledCourse> has a well-known Schema type, but we are logically saying through annotations like sml:ref="true" that it may be/is _also, concurrently_ compliant to another type (semantically as humans understand things, not in the strict Schema sense of type definition). For each reference scheme we define a set of content that when mixed into the element's content allows us to treat the element as if it is "a reference", i.e. an instance of some reference type. Others might call this composition. Note that the determination of whether or not a reference is empty, meaning sml:ref="true" but it is otherwise devoid of attributes, child elements, etc (information items) associated with a reference scheme will _always_ be a function of the reference schemes known to the consumer. This might cause some to tilt at first (I did), but think about the extreme case where a scheme is defined with no associated information items (one of Sandy's perverse inventions... once an element with sml:ref="true" is found, in the absence of any other recognized reference scheme, it would resolve the reference to a fixed point ... document root, reference element, whatever). I'm not sure how much practical use we can make of the "empty reference" semantic unless we introduce a clear syntactic way to recognize it and distinguish it from "no content from schemes recognized by the consumer", and before introducing new syntax I'd want to be very sure we have a use for it important enough to justify the added complexity. Assuming we keep the semantic, if the reference is empty and target required is true on the element's type definition, why would that not be an error? Target required = true means that the reference must resolve to an element w/in the model, I see no way for an empty reference to do so. I can see "no, not an error" making sense only if people were assuming empty = null ... lacking any concrete definition of "empty reference", I cannot be sure of this. Null refs: semantically, lots of fields have found such a concept useful (Java, XML Schema validation, ...). I remember Sandy asserting that such a concept would be useful to distinguish between two cases: (1) producer intentionally omitted reference scheme content (2) producer erroneously omitted reference scheme content ... in other words to declare the difference of intent. His example was a swizzle on <EnrolledCourse> ... assume each course has 1-2 instructors (required primary and optional secondary). What if any constraints do we want to place on the specification of primary/alternate instructors (more generally, on optional references)? Alternative A: primary specifies sml:ref="true" at the schema (type) level; secondary must not specify sml:ref="true" at the schema (type) level, and each instance of secondary has sml:ref="false" implicitly and/or explicitly. When no secondary exists, it has sml:ref="false" (not a reference). Alternative B: primary specifies sml:ref="true" at the schema (type) level; secondary specifies sml:ref="true" at the schema (type) level, and each instance of secondary has either a reference instance or is a null reference. When no secondary exists, it has sml:ref="true" (because it is required by its type definition) and is a null reference (however that is syntactically recognized). There are doubtless other variations, but A and B may be sufficient to highlight the issues around this choice. Static analysis is the obvious one. Code with knowledge of the instructor schema (note I am not asserting schema validation at run time... could be a model similar to Java client stub generation for web services, which generates Java code based on the WSDL for the input message(s)) would not know in alternative A that secondary instructors are references (when present). In alternative B that knowledge is available. This is not a trivial difference. If we want to keep the semantic of null references, we need a consistent way to syntactically recognize them that encompasses our broad view of how reference schemes can be defined (the FPWD definition of xsi:nil="true" is insufficient, as noted above under "empty refs"). Let's settle on whether or not the semantic has value before proposing syntaxes. Assuming we retain null references, I'm not sure what it means to talk about resolving one (which evaluation of target required="true" would necessitate). In this case I can see where we might want to say, given there is no input to the resolution process, that target required is irrelevant (alternatively, that a null element is trivially part of every model, just like the null set is a member of every set in mathematics). I could also see that we might want to say the opposite (a null reference is never in any model, so target required = true always conflicts with a null reference; if you want to allow null refs, target required must be false)... this view is equivalent to saying that XML Schema nillable="true" for element declarations is analogous to sml:targetRequired="false" for reference information items). Best Regards, John Street address: 2455 South Road, Poughkeepsie, NY USA 12601 Voice: 1+845-435-9470 Fax: 1+845-432-9787
Received on Wednesday, 22 August 2007 14:29:45 UTC