[
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
|