OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

 


 

   Re: [xml-dev] Extending type definitions using RelaxNG Compact

[ Lists Home | Date Index | Thread Index ]

Kristopher Brown wrote:
> Hi,
> 
> We are using xsd:string as the base datatype for our types: e.g.
> 
>   datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes";
> 
>   FirstName = xsd:string {
>       maxLength = "30"
>   }
> 
>   LastName = xsd:string {
>       maxLength = "60"
>   }
> 
> We'd like to introduce a more restricted string type, something like:
> 
>   AlphaString = xsd:string {
>       pattern = "[a-zA-Z]*"
>   }
> 
>   FirstName = AlphaString {
>       maxLength = "30"
>   }
> 
>   LastName = AlphaString {
>       maxLength = "60"
>   }

> Unfortunately, the "FirstName = AlphaString" example doesn't work.  Does
> anyone know a way of achieving what I'm trying to do?  Is it even
> possible with RelaxNG?

Not possible in RelaxNG 1.0.  During the development of RelaxNG 1.0, we 
attempted to solve this, but we didn't manage to achieve a solution that 
we found sufficiently simple.  I would like to see this solved in a 
future version of RelaxNG.

I have been thinking about the following approach.  TREX provided a 
concur operator which would have been sufficient for this, but it didn't 
make it into RelaxNG, because there are major implementation issues.  In 
RelaxNG 1.0, <data> elements can have an <except> clause; in the compact 
syntax this is expressed by following the datatype with "-" and a 
pattern.  For example,

   xsd:token - "foo"

matches any string other than "foo".  You can think of this as being a 
difference operator restricted to a left-hand operand of <data>; a 
general difference operator would have the same implementation issues as 
concur.  We could similarly introduce a restricted version of concur 
that works only with datatypes.  Let's suppose we use : for this.  Then 
you example could be written:

   AlphaString = xsd:string {
       pattern = "[a-zA-Z]*"
   }

   FirstName = xsd:string { maxLength = "30" } : AlphaString

   LastName = xsd:string { maxLength = "60 } : AlphaString

The semantics of

   dt : pattern

are simply that it matches if both dt and pattern match.

The XML syntax might be

<data type="string">
   <param name="maxLength">30</param>
   <restrict>
     <ref name="AlphaString"/>
   </restrict>
</data>

James







 

News | XML in Industry | Calendar | XML Registry
Marketplace | Resources | MyXML.org | Sponsors | Privacy Statement

Copyright 2001 XML.org. This site is hosted by OASIS