- From: Gary Hallmark <gary.hallmark@oracle.com>
- Date: Tue, 14 Oct 2008 22:21:21 -0700
- To: Dave Reynolds <der@hplb.hpl.hp.com>
- CC: RIF WG <public-rif-wg@w3.org>
Of course, for the case where there is more than one target namespace,
one would need the abbreviated syntax, not the very abbreviated. So
yeah, I guess maybe we just bite the bullet and adopt their syntax,
since it works for all cases.
Gary Hallmark wrote:
> Dave,
>
> Thanks for the suggestion -- I wasn't aware of this work. The
> abbreviated syntax looks in the common case where there is a target
> namespace, e.g. instead of an IRI like
>
> http://example.org/shiporder/shipto/country
>
> You get something like
>
> http://example.org#xmlns(tns,http://example.org)xscd(/tns:shiporder/country)
>
>
> I think it is because they don't assume that the IRI on the left of
> the '#' is in fact the target namespace. I think that they should
> consider a "very abbreviated syntax" e.g.
>
> http://example.org#/shiporder/shipto/country
>
> when http://example.org is the target namespace of the global element
> or type (shiporder here).
>
> I do think its a good idea to adopt a subset of their abbreviated
> schema component paths (stuff inside xscd(...)). E.g. using /~ to
> denote the type axis and /@ to denote the attribute axis. I would not
> allow //.
>
> Dave Reynolds wrote:
>>
>> Hi Gary,
>>
>> Not studied this properly yet but one comment/question:
>>
>> Might it make sense to use the URI format from XML Schema Component
>> Designators (the abbreviated syntax) for the class/property URIs?
>>
>> I realize that XSCD is still a work in progress, and has been in
>> progress for a while, so we probably don't want a dependency.
>> However, having our URIs compatible with their current proposals
>> might be worth contemplating.
>>
>> Warning: I've very little knowledge or understanding of XSCD so this
>> may be a stupid suggestion but at the least we probably want an
>> answer to any future last call comment around "why not use XSCD".
>>
>> Dave
>>
>> Gary Hallmark wrote:
>>>
>>> This is in response to ACTION-591.
>>>
>>> Mapping XML Schema valid XML Data to RIF Frames
>>> ===============================================
>>>
>>> This is a strawman for mapping XML documents whose structure is
>>> described by an XML schema[1] to and
>>> from RIF Core frames.
>>>
>>> An XML element has a type as defined by its schema. The type can be
>>> simple or complex. Simple types
>>> can be atomic, lists, or unions. Atomic types can be primitive
>>> (e.g. xs:string), or they can be
>>> enumerations or restrictions of atomic types. A complex type can
>>> have attributes and content. The
>>> content can be simple, or it can be a sequence, choice, or set of
>>> elements. An attribute has a name and
>>> a value. The value has a simple type. Types can be derived by
>>> extension or restriction.
>>> Elements and types can be named globally or locally. A local
>>> element can be defined by referring to a
>>> global element. An element may be defined by referring to a global
>>> type, or can include the type
>>> definition in the content of its own definition. There are many
>>> ways to write the "same" schema.
>>>
>>> Thus, XML schema is quite complex. Here, we limit our concern to
>>> mapping elements of complex type to
>>> frames. The only simple types we will handle are the primitive types
>>> supported by RIF DTB. Our
>>> contribution is mainly to define how to construct IRIs of class
>>> constants and slot name constants from
>>> the XML schema.
>>>
>>> This is a "strawman by example", so we start with an example
>>> document (from [2]).
>>>
>>> Example XML Document
>>> --------------------
>>>
>>> <shiporder orderid="889923" xmlns="http://example.org">
>>> <orderperson>John Smith</orderperson>
>>> <shipto>
>>> <name>Ola Nordmann</name>
>>> <address>Langgt 23</address>
>>> <city>4000 Stavanger</city>
>>> <country>Norway</country>
>>> </shipto>
>>> <item>
>>> <title>Empire Burlesque</title>
>>> <note>Special Edition</note>
>>> <quantity>1</quantity>
>>> <price>10.90</price>
>>> </item>
>>> <item>
>>> <title>Hide your heart</title>
>>> <quantity>1</quantity>
>>> <price>9.90</price>
>>> </item>
>>> </shiporder>
>>>
>>> We consider 3 ways to write a schema for the above document.
>>>
>>> 1. One big element
>>> ------------------
>>>
>>> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
>>> targetNamespace="http://example.org">
>>>
>>> <xs:element name="shiporder">
>>> <xs:complexType>
>>> <xs:sequence>
>>> <xs:element name="orderperson" type="xs:string"/>
>>> <xs:element name="shipto">
>>> <xs:complexType>
>>> <xs:sequence>
>>> <xs:element name="name" type="xs:string"/>
>>> <xs:element name="address" type="xs:string"/>
>>> <xs:element name="city" type="xs:string"/>
>>> <xs:element name="country" type="xs:string"/>
>>> </xs:sequence>
>>> </xs:complexType>
>>> </xs:element>
>>> <xs:element name="item" maxOccurs="unbounded">
>>> <xs:complexType>
>>> <xs:sequence>
>>> <xs:element name="title" type="xs:string"/>
>>> <xs:element name="note" type="xs:string" minOccurs="0"/>
>>> <xs:element name="quantity" type="xs:positiveInteger"/>
>>> <xs:element name="price" type="xs:decimal"/>
>>> </xs:sequence>
>>> </xs:complexType>
>>> </xs:element>
>>> </xs:sequence>
>>> <xs:attribute name="orderid" type="xs:string" use="required"/>
>>> </xs:complexType>
>>> </xs:element>
>>>
>>> </xs:schema>
>>>
>>> Using the above schema, we represent the shiporder using the
>>> following RIF-PS:
>>>
>>> Prefix(tns http://example.org)
>>>
>>> _obj1#<tns:/shiporder>
>>> _obj1[<tns:/shiporder@orderid> -> "889923"
>>> <tns:/shiporder/orderperson> -> "John Smith"
>>> <tns:/shiporder/shipto> -> _obj2
>>> <tns:/shiporder/item> -> _obj3
>>> <tns:/shiporder/item> -> _obj4
>>> ]
>>>
>>> _obj2#<tns:/shiporder/shipto>
>>> _obj2[<tns:/shiporder/shipto/name> -> "Ola Nordmann"
>>> <tns:/shiporder/shipto/address> -> "Langgt 23"
>>> <tns:/shiporder/shipto/city> -> "4000 Stavanger"
>>> <tns:/shiporder/shipto/country> -> "Norway"
>>> ]
>>>
>>> _obj3#<tns:/shiporder/item>
>>> _obj3[<tns:/shiporder/item/title> -> "Empire Burlesque"
>>> <tns:/shiporder/item/note> -> "Special Edition"
>>> <tns:/shiporder/item/quantity> -> 1
>>> <tns:/shiporder/item/price> -> 10.90
>>> ]
>>>
>>> _obj4#<tns:/shiporder/item>
>>> _obj4[<tns:/shiporder/item/title> -> "Hide your heart"
>>> <tns:/shiporder/item/quantity> -> 1
>>> <tns:/shiporder/item/price> -> 9.90
>>> ]
>>>
>>>
>>> 2. Refs to Global Elements and Attributes
>>> -----------------------------------------
>>>
>>> A second equivalent schema uses the following style.
>>>
>>> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
>>> targetNamespace="http://example.org">
>>>
>>> <!-- definition of simple elements -->
>>> <xs:element name="orderperson" type="xs:string"/>
>>> <xs:element name="name" type="xs:string"/>
>>> <xs:element name="address" type="xs:string"/>
>>> <xs:element name="city" type="xs:string"/>
>>> <xs:element name="country" type="xs:string"/>
>>> <xs:element name="title" type="xs:string"/>
>>> <xs:element name="note" type="xs:string"/>
>>> <xs:element name="quantity" type="xs:positiveInteger"/>
>>> <xs:element name="price" type="xs:decimal"/>
>>>
>>> <!-- definition of attributes -->
>>> <xs:attribute name="orderid" type="xs:string"/>
>>>
>>> <!-- definition of complex elements -->
>>> <xs:element name="shipto">
>>> <xs:complexType>
>>> <xs:sequence>
>>> <xs:element ref="name"/>
>>> <xs:element ref="address"/>
>>> <xs:element ref="city"/>
>>> <xs:element ref="country"/>
>>> </xs:sequence>
>>> </xs:complexType>
>>> </xs:element>
>>> <xs:element name="item">
>>> <xs:complexType>
>>> <xs:sequence>
>>> <xs:element ref="title"/>
>>> <xs:element ref="note" minOccurs="0"/>
>>> <xs:element ref="quantity"/>
>>> <xs:element ref="price"/>
>>> </xs:sequence>
>>> </xs:complexType>
>>> </xs:element>
>>>
>>> <xs:element name="shiporder">
>>> <xs:complexType>
>>> <xs:sequence>
>>> <xs:element ref="orderperson"/>
>>> <xs:element ref="shipto"/>
>>> <xs:element ref="item" maxOccurs="unbounded"/>
>>> </xs:sequence>
>>> <xs:attribute ref="orderid" use="required"/>
>>> </xs:complexType>
>>> </xs:element>
>>>
>>> </xs:schema>
>>>
>>> Using the above schema, we represent the shiporder using the
>>> following RIF-PS:
>>>
>>> Prefix(tns http://example.org)
>>>
>>> _obj1#<tns:/shiporder>
>>> _obj1[<tns:@orderid> -> "889923"
>>> <tns:/orderperson> -> "John Smith"
>>> <tns:/shipto> -> _obj2 <tns:/item> -> _obj3
>>> <tns:/item> -> _obj4
>>> ]
>>>
>>> _obj2#<tns:/shipto>
>>> _obj2[<tns:/name> -> "Ola Nordmann"
>>> <tns:/address> -> "Langgt 23"
>>> <tns:/city> -> "4000 Stavanger"
>>> <tns:/country> -> "Norway"
>>> ]
>>>
>>> _obj3#<tns:/item>
>>> _obj3[<tns:/title> -> "Empire Burlesque"
>>> <tns:/note> -> "Special Edition"
>>> <tns:/quantity> -> 1
>>> <tns:/price> -> 10.90
>>> ]
>>>
>>> _obj4#<tns:/item>
>>> _obj4[<tns:/title> -> "Hide your heart"
>>> <tns:/quantity> -> 1
>>> <tns:/price> -> 9.90
>>> ]
>>>
>>> 3. Named Types
>>> --------------
>>>
>>> The third style of schema uses named types.
>>>
>>> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
>>> targetNamespace="http://example.org">
>>>
>>> <xs:simpleType name="stringtype">
>>> <xs:restriction base="xs:string"/>
>>> </xs:simpleType>
>>>
>>> <xs:simpleType name="inttype">
>>> <xs:restriction base="xs:positiveInteger"/>
>>> </xs:simpleType>
>>>
>>> <xs:simpleType name="dectype">
>>> <xs:restriction base="xs:decimal"/>
>>> </xs:simpleType>
>>>
>>> <xs:simpleType name="orderidtype">
>>> <xs:restriction base="xs:string">
>>> <xs:pattern value="[0-9]{6}"/>
>>> </xs:restriction>
>>> </xs:simpleType>
>>>
>>> <xs:complexType name="shiptotype">
>>> <xs:sequence>
>>> <xs:element name="name" type="stringtype"/>
>>> <xs:element name="address" type="stringtype"/>
>>> <xs:element name="city" type="stringtype"/>
>>> <xs:element name="country" type="stringtype"/>
>>> </xs:sequence>
>>> </xs:complexType>
>>>
>>> <xs:complexType name="itemtype">
>>> <xs:sequence>
>>> <xs:element name="title" type="stringtype"/>
>>> <xs:element name="note" type="stringtype" minOccurs="0"/>
>>> <xs:element name="quantity" type="inttype"/>
>>> <xs:element name="price" type="dectype"/>
>>> </xs:sequence>
>>> </xs:complexType>
>>>
>>> <xs:complexType name="shipordertype">
>>> <xs:sequence>
>>> <xs:element name="orderperson" type="stringtype"/>
>>> <xs:element name="shipto" type="shiptotype"/>
>>> <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
>>> </xs:sequence>
>>> <xs:attribute name="orderid" type="orderidtype" use="required"/>
>>> </xs:complexType>
>>>
>>> <xs:element name="shiporder" type="shipordertype"/>
>>>
>>> </xs:schema>
>>>
>>> Using the above schema, we represent the shiporder using the
>>> following RIF-PS:
>>>
>>> Prefix(tns http://example.org)
>>>
>>> _obj1#<tns:/shiporder>
>>> <tns:/shiporder>##<tns:/shipordertype>
>>> _obj1[<tns:/shipordertype@orderid> -> "889923"
>>> <tns:/shipordertype/orderperson> -> "John Smith"
>>> <tns:/shipordertype/shipto> -> _obj2
>>> <tns:/shipordertype/item> -> _obj3
>>> <tns:/shipordertype/item> -> _obj4
>>> ]
>>>
>>> _obj2#<tns:/shiptotype>
>>> _obj2[<tns:/shiptotype/name> -> "Ola Nordmann"
>>> <tns:/shiptotype/address> -> "Langgt 23"
>>> <tns:/shiptotype/city> -> "4000 Stavanger"
>>> <tns:/shiptotype/country> -> "Norway"
>>> ]
>>>
>>> _obj3#<tns:/itemtype>
>>> _obj3[<tns:/itemtype/title> -> "Empire Burlesque"
>>> <tns:/itemtype/note> -> "Special Edition"
>>> <tns:/itemtype/quantity> -> 1
>>> <tns:/itemtype/price> -> 10.90
>>> ]
>>>
>>> _obj4#<tns:/itemtype>
>>> _obj4[<tns:/itemtype/title> -> "Hide your heart"
>>> <tns:/itemtype/quantity> -> 1
>>> <tns:/itemtype/price> -> 9.90
>>> ]
>>>
>>> General Rules
>>> -------------
>>>
>>> 1. order of sequences is not preserved
>>>
>>> 2. cardinality (minOccurs, maxOccurs) is ignored
>>>
>>> 3. simple types are ignored
>>>
>>> 4. the IRI for an element e (IRI(e)) is given by
>>> a. <tns:/e> if e is a global element, where tns is the
>>> targetNamespace of the schema
>>> b. <C:/e> otherwise, where C is the IRI of the containing
>>> complexType of e
>>>
>>> 5. the IRI for an attribute a (IRI(a)) is given by
>>> a. <tns:@a> if a is a global attribute
>>> b. <C:@a> otherwise, where C is the IRI of the containing
>>> complexType of a
>>>
>>> 6. the IRI for a complexType c (IRI(c)) is given by
>>> a. <tns:/c> if c is a global complexType
>>> b. <E:c> otherwise, where E is the IRI of the element containing c
>>>
>>> 7. an instance of an XML element e with complexType c maps to an
>>> object _o that is a member of IRI(e).
>>> I.e., _o#IRI(e). If IRI(e) != IRI(c), then additionally we have the
>>> axiom IRI(e)##IRI(c).
>>>
>>> 8. an element f contained in e (whether in a sequence, choice, or
>>> all) is a frame slot of _o named
>>> IRI(f). E.g. _o[IRI(f)->...]
>>>
>>> 9. if complexType sub extends a complexType sup, then
>>> IRI(sub)##IRI(sup)
>>>
>>> Issues
>>> ------
>>>
>>> Slot names are not disjoint from class names.
>>>
>>> We could of course map much more schema information to axioms. E.g.
>>> maxOccurs=1 could be expressed as
>>> ?x=?y :- _o[slot1->?x slot1->?y]. But that's not Core. Are there
>>> other things expressible in Core that
>>> we should map?
>>>
>>> Should we care if the trailing char of tns is '/'? or should we use
>>> '#' instead of the first '/' in the
>>> curie? or should we use '/' or '/@' instead of '@' for attributes?
>>>
>>> Neither '#' nor '##' is legal in the conclusion in Core. Probably
>>> they should be allowed in ground
>>> facts.
>>>
>>> Because we don't capture all the schema constraints, it may be
>>> impossible to serialize a collection of
>>> frames computed by a seemingly consistent ruleset into a
>>> schema-valid XML document.
>>>
>>> Fully-striped XML data doesn't need a schema, and probably should
>>> follow an RDF-style mapping (not
>>> covered here).
>>>
>>>
>>> [1] http://www.w3.org/TR/xmlschema-0/
>>> [2] http://www.w3schools.com/Schema/schema_example.asp
>>>
>>
>>
>>
>
Received on Wednesday, 15 October 2008 05:22:43 UTC