[Home] [By Thread] [By Date] [Recent Entries]

  • From: Webb Roberts <strebor@g...>
  • To: "Costello, Roger L." <costello@m...>
  • Date: Mon, 11 May 2009 18:05:04 -0400

If you moved "kind" from being an attribute to being the name of the
element, then XML Schema validation could handle all the constraints.

Webb

  <Book>
    <Title>Everything is Miscellaneous</Title>
    <Author>David Weinberger</Author>
    <Date>2007</Date>
    <ISBN>0-8050-8811-3</ISBN>
    <Publisher>Henry Holt and Company, LLC</Publisher>
  </Book>
  <Magazine>
    <Title>Science News</Title>
    <Date>2005</Date>
  </Magazine>


On Mon, May 11, 2009 at 2:53 PM, Costello, Roger L. <costello@m...> wrote:
>
> Hi Folks,
>
> Consider this book publication:
>
>    <Publication kind="book">
>        <Title>Everything is Miscellaneous</Title>
>        <Author>David Weinberger</Author>
>        <Date>2007</Date>
>        <ISBN>0-8050-8811-3</ISBN>
>        <Publisher>Henry Holt and Company, LLC</Publisher>
>    </Publication>
>
>
> Next, consider this magazine publication:
>
>    <Publication kind="magazine">
>        <Title>Science News</Title>
>        <Date>2005</Date>
>    </Publication>
>
>
> Notice the *kind* attribute in both examples.
>
> If its value is 'book' then the content of <Publication> is:
>
>    - Title
>    - Author
>    - Date
>    - ISBN
>    - Publisher
>
> And if its value is 'magazine' then the content of <Publication> is:
>
>    - Title
>    - Date
>
>
>
> PROBLEM STATEMENT
>
> What is best practice for constraining the content of Publication?
>
>
>
> XML SCHEMA 1.1 PROVIDES TWO APPROACHES
>
> XML Schema 1.1 provides two approaches to constraining the content of the <Publication> element.
>
>
>
> APPROACH #1: ALTERNATE TYPES
>
> Create a BookType and a MagazineType and then select one of them to be Publication's type depending on @kind:
>
>   if @kind = 'book' then select BookType
>   else select MagazineType
>
>
> Here's how it is expressed in XML Schema 1.1:
>
>   <xs:element name="Publication" type="PublicationType">
>      <xs:alternative test="@kind eq 'magazine'" type="MagazineType" />
>      <xs:alternative test="@kind eq 'book'" type="BookType" />
>   </xs:element>
>
>
> You see the (new) <alternative> element being used to select a type for Publication based on the value of @kind.
>
>
> (I don't show the complexType definition for MagazineType and BookType because it's the same as in XML Schema 1.0.)
>
>
>
> APPROACH #2: XPATH EXPRESSION
>
> Let the content of Publication be a collection of all the elements (both book elements and magazine elements) and set them optional:
>
>    - Title (0,1)
>    - Author (0, unbounded)
>    - Date (0,1)
>    - ISBN (0,1)
>    - Publisher (0,1)
>
>
> Then create an XPath expression that selects the set of children for Publication depending on the value of @kind:
>
>   if (@kind eq 'book') then
>      Title and Date and ISBN and Publisher and
>          empty(* except (Title[1],Date[1],Author,ISBN[1],Publisher[1]))
>   else
>      if (@kind eq 'magazine') then
>         Title and Date and
>           empty(* except (Title[1],Date[1]))
>      else
>         true()
>
>
> Here's how it is expressed in XML Schema 1.1:
>
> <xs:element name="Publication">
>    <xs:complexType>
>       <xs:sequence>
>            <xs:element name="Title" type="xs:string"  minOccurs="0"/>
>            <xs:element name="Author" type="xs:string" minOccurs="0"
>                                                       maxOccurs="unbounded"/>
>            <xs:element name="Date" type="xs:gYear"  minOccurs="0"/>
>            <xs:element name="ISBN" type="xs:string"  minOccurs="0"/>
>            <xs:element name="Publisher" type="xs:string"  minOccurs="0"/>
>       </xs:sequence>
>       <xs:attribute name="kind" type="xs:string" />
>       <xs:assert test="if (@kind eq 'book') then
>                          Title and Date and ISBN and Publisher and
>                          empty(* except (Title[1],Date[1],Author,ISBN[1],Publisher[1]))
>                        else
>                            if (@kind eq 'magazine') then
>                               Title and Date and empty(* except (Title[1],Date[1]))
>                            else
>                               Title and Date and
>                                  empty(* except (Title[1],Date[1], Author))" />
>    </xs:complexType>
> </xs:element>
>
>
> You see that the content of Publication is all the book and magazine elements and they are optional.
>
> You see an XPath expression within the (new) <assert> element being used to constrain which child elements are allowed within Publication based on the value of @kind.
>
>
>
> TWO APPROACHES
>
> You have seen two ways of solving the problem of constraining the content of Publication:
>
> (a) Run-time selection of alternate types
>
> (b) Run-time selection of child elements using XPath
>
>
>
> DEFINITION OF "RUN-TIME"
>
> By "run-time" I mean that the content of Publication is not determined until an instance document is validated against a schema.
>
>
>
> WHICH IS BEST PRACTICE?
>
> Which approach is best practice?
>
> What are the pros and cons of each approach?
>
>
> /Roger
> _______________________________________________________________________
>
> XML-DEV is a publicly archived, unmoderated list hosted by OASIS
> to support XML implementation and development. To minimize
> spam in the archives, you must subscribe before posting.
>
> [Un]Subscribe/change address: http://www.oasis-open.org/mlmanage/
> Or unsubscribe: xml-dev-unsubscribe@l...
> subscribe: xml-dev-subscribe@l...
> List archive: http://lists.xml.org/archives/xml-dev/
> List Guidelines: http://www.oasis-open.org/maillists/guidelines.php
>
>


[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index]


Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member