Wildcards in SML schema

Discussion in 'XML' started by Grant Robertson, Jun 6, 2007.

  1. If I use the 'any' element in my schema to allow elements from another
    schema to be used in instance documents based on my schema, is there a
    way to force that the contents of that element must be an entire,
    complete instance document for that other schema?

    Let's say I have the following schema:

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="BogusElement" type="BogusType"/>
    <xs:complexType name="BogusType">
    <xs:sequence>
    <xs:any namespace="http://www.w3.org/1999/xhtml"/>
    </xs:sequence>
    </xs:complexType>
    </xs:schema>

    It has only the one element BogusElement and it can contain only the one
    child element from the XHTML schema. Does this force the BogusElement
    element in the instance document to contain a complete XHTML document
    including headers or would

    <?xml version="1.0" encoding="UTF-8"?>
    <BogusElement
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="Untitled1.xsd"
    xmlns:xhtml="http://www.w3.org/1999/xhtml">
    <xhtml:strong>Bolded Text.</xhtml:strong>
    </BogusElement>

    be a valid document under the above schema?

    How can I make it so that the contents of the BogusElement element in the
    instance document must be a complete XHTML document in order to be valid?
    Or would I just have to make that a verbal rule, not expressed in the
    schema?

    To complicate things further: Let's say I wanted that element to contain
    only one of a list of valid, complete documents such as either a complete
    html document OR a complete XHTML document OR a complete DocBook
    document, all with headers. How would I do that?

    Basically, I am trying to build a standard that acts as an envelope
    around complete documents which can be of various different text-based
    formats.
     
    Grant Robertson, Jun 6, 2007
    #1
    1. Advertising

  2. Grant Robertson

    Guest

    On 6 Jun, 04:46, Grant Robertson <> wrote:
    > If I use the 'any' element in my schema to allow elements from another
    > schema to be used in instance documents based on my schema, is there a
    > way to force that the contents of that element must be an entire,
    > complete instance document for that other schema?
    >
    > Let's say I have the following schema:
    >
    > <?xml version="1.0" encoding="UTF-8"?>
    > <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    > <xs:element name="BogusElement" type="BogusType"/>
    > <xs:complexType name="BogusType">
    > <xs:sequence>
    > <xs:any namespace="http://www.w3.org/1999/xhtml"/>
    > </xs:sequence>
    > </xs:complexType>
    > </xs:schema>


    This would allow any global element from www.w3.org/1999/xhtml/.

    > <?xml version="1.0" encoding="UTF-8"?>
    > <BogusElement
    > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    > xsi:noNamespaceSchemaLocation="Untitled1.xsd"
    > xmlns:xhtml="http://www.w3.org/1999/xhtml">
    > <xhtml:strong>Bolded Text.</xhtml:strong>
    > </BogusElement>
    >
    > be a valid document under the above schema?


    Yes.

    > How can I make it so that the contents of the BogusElement element in the
    > instance document must be a complete XHTML document in order to be valid?
    > Or would I just have to make that a verbal rule, not expressed in the
    > schema?


    You could try the following schema approach...

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="BogusElement" type="BogusType"/>
    <xs:complexType name="BogusType">
    <xs:sequence>
    <xs:element xmlns:xhtml="http://www.w3.org/1999/xhtml"
    ref="xhtml:xthml"/>
    </xs:sequence>
    </xs:complexType>
    </xs:schema>

    > To complicate things further: Let's say I wanted that element to contain
    > only one of a list of valid, complete documents such as either a complete
    > html document OR a complete XHTML document OR a complete DocBook
    > document, all with headers. How would I do that?


    Including an HTML document obviously has the problem that an HTML
    document is not typically well-formed XML. But we can leave that
    aside for the moment!

    Also, I'm not sure of the valid set of DocBook schemas.

    Given that, your schema could look something like:

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="BogusElement" type="BogusType"/>
    <xs:complexType name="BogusType">
    <xs:choice> <!--Changed from sequence-->
    <xs:element xmlns:xhtml="http://www.w3.org/1999/xhtml"
    ref="xhtml:xthml"/>
    <xs:element xmlns:docbook="http://docbook"
    ref="docbook:docbook"/>
    </xs:choice>
    </xs:complexType>
    </xs:schema>

    HTH,

    Pete.
    --
    =============================================
    Pete Cordell
    Codalogic Ltd
    for XML Schema to C++ data binding visit
    http://www.codalogic.com/lmx/
    =============================================
     
    , Jun 6, 2007
    #2
    1. Advertising

  3. Hi Grant,

    Grant Robertson <> writes:

    > If I use the 'any' element in my schema to allow elements from another
    > schema to be used in instance documents based on my schema, is there a
    > way to force that the contents of that element must be an entire,
    > complete instance document for that other schema?


    If the schema for the namespace that you allow in your wildcard only
    defines one global element that represents a complete document of
    that vocabulary, then yes.


    > Let's say I have the following schema:
    >
    > <?xml version="1.0" encoding="UTF-8"?>
    > <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    > <xs:element name="BogusElement" type="BogusType"/>
    > <xs:complexType name="BogusType">
    > <xs:sequence>
    > <xs:any namespace="http://www.w3.org/1999/xhtml"/>
    > </xs:sequence>
    > </xs:complexType>
    > </xs:schema>
    >
    > It has only the one element BogusElement and it can contain only the one
    > child element from the XHTML schema. Does this force the BogusElement
    > element in the instance document to contain a complete XHTML document
    > including headers or would
    >
    > <?xml version="1.0" encoding="UTF-8"?>
    > <BogusElement
    > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    > xsi:noNamespaceSchemaLocation="Untitled1.xsd"
    > xmlns:xhtml="http://www.w3.org/1999/xhtml">
    > <xhtml:strong>Bolded Text.</xhtml:strong>
    > </BogusElement>
    >
    > be a valid document under the above schema?


    It depends on the schema that defines the XHTML vocabulary. If it defines
    strong as a global element then the above instance will be valid.

    > To complicate things further: Let's say I wanted that element to contain
    > only one of a list of valid, complete documents such as either a complete
    > html document OR a complete XHTML document OR a complete DocBook
    > document, all with headers. How would I do that?


    I think if you have a predefined set of "content documents" then using
    the choice construct might be a good idea. Alternatively, you can
    introduce another level of indirection. With this approach you change
    BogusType to read like so:

    <xs:complexType name="BogusType">
    <xs:sequence>
    <xs:any namespace="http://www.example.com/envelop-content"/>
    </xs:sequence>
    </xs:complexType>

    In other words, you only allow elements in place of a wildcard to be
    from a namespace (or namespaces) that you control. Then you define
    the envelop-content vocabulary like this:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
    targetNamespace="http://www.example.com/envelop-content">

    <xs:import ... import XHTML schema ...>

    <xs:element name="xhtml-content">
    <xs:complexType>
    <xs:sequence>
    <xs:element ref="xhtml::html"/>
    </xs:sequence>
    </xs:complexType>
    </xs:element>

    ... Other *-content elements

    </xs:schema>


    hth,
    -boris
    --
    Boris Kolpackov
    Code Synthesis Tools CC
    http://www.codesynthesis.com
    Open-Source, Cross-Platform C++ XML Data Binding
     
    Boris Kolpackov, Jun 6, 2007
    #3
  4. In article <>,
    says...
    > <xs:element xmlns:xhtml="http://www.w3.org/1999/xhtml" ref="xhtml:xthml"/>



    It looks like what you have done here is replace the

    <xs:any namespace="http://www.w3.org/1999/xhtml"/>

    component of my schema with an element-type component that lists a
    namespace and then references the root element of that namespace. Is my
    interpretation of this correct? Secondly, is this a valid XSD component?
    What is this technique called (so I can look it up)?
     
    Grant Robertson, Jun 7, 2007
    #4
  5. Perhaps I should ask the more general question:

    When people are creating an XML schema and they want to allow content
    creators to insert full XML documents based on other schemas directly
    within only certain elements of XML documents based on their new schema:
    what do they do?
     
    Grant Robertson, Jun 7, 2007
    #5
  6. Grant Robertson wrote:
    > When people are creating an XML schema and they want to allow content
    > creators to insert full XML documents based on other schemas directly
    > within only certain elements of XML documents based on their new schema:
    > what do they do?


    If you don't know which other schemas, make the content model of those
    specific elements accept elements from other schemas (by using xsd:any).
    I don't know of any way to say "accept only top-level elements/complete
    documents"; once you open the window, anything can fly in.

    Or you can spell out the specific root nodes you're willing to accept as
    part of this element's content.

    For an example of this, look at how the W3C has been designing XHTML to
    allow plugging in fragments written in other specifications.


    --
    Joe Kesselman / Beware the fury of a patient man. -- John Dryden
     
    Joseph Kesselman, Jun 7, 2007
    #6
  7. Grant Robertson

    Guest

    On 7 Jun, 16:21, Grant Robertson <> wrote:
    > In article <>,
    > says...
    >
    > > <xs:element xmlns:xhtml="http://www.w3.org/1999/xhtml" ref="xhtml:xthml"/>

    >
    > It looks like what you have done here is replace the
    >
    > <xs:any namespace="http://www.w3.org/1999/xhtml"/>
    >
    > component of my schema with an element-type component that lists a
    > namespace and then references the root element of that namespace. Is my
    > interpretation of this correct? Secondly, is this a valid XSD component?
    > What is this technique called (so I can look it up)?


    That's right. Basically, it's a regular <xs:element ref=".../> schema
    statement. The specification of the xhtml namespace prefix is
    included in the element definition as it seems a convenient place to
    do it, but it could equally have been defined in any of the parent
    elements.

    (Incidently - the current draft version of XSD 1.1 has better control
    of xs:any wildcards. I wouldn't wait until the standard is published
    and tools are available though!)

    HTH,

    Pete.
    --
    =============================================
    Pete Cordell
    Codalogic Ltd
    for XML Schema to C++ data binding visit
    http://www.codalogic.com/lmx/
    =============================================
     
    , Jun 7, 2007
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Thomas F. O'Connell

    Negative Lookbehind and Wildcards

    Thomas F. O'Connell, Feb 27, 2004, in forum: Perl
    Replies:
    1
    Views:
    750
    Gunnar Hjalmarsson
    Feb 28, 2004
  2. DotNetJunkies User

    DataView filters with wildcards

    DotNetJunkies User, May 24, 2004, in forum: ASP .Net
    Replies:
    0
    Views:
    571
    DotNetJunkies User
    May 24, 2004
  3. Shiva

    Java to access SML

    Shiva, Nov 30, 2003, in forum: Java
    Replies:
    0
    Views:
    362
    Shiva
    Nov 30, 2003
  4. Markus
    Replies:
    1
    Views:
    1,661
    Markus
    Nov 23, 2005
  5. Stanimir Stamenkov
    Replies:
    3
    Views:
    1,325
    Stanimir Stamenkov
    Apr 25, 2005
Loading...

Share This Page