views:

250

answers:

2

Why won't this xml schema validate ? Visual studio says that the simpleContent tag is an invalid tag. If I then remove the attribute it says that the base type for my restriction is undefined in http://www.w3.org/2001/XMLSchema

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >    
    <xs:complexType name="Person">
        <xs:attribute name="isProcessed" type="xs:boolean" />
        <xs:simpleContent>
            <xs:restriction base="xs:string">
                <xs:enumeration value="Male" />
                <xs:enumeration value="Female" />        
            </xs:restriction>
        </xs:simpleContent>    
    </xs:complexType>
</xs:schema>

@marc_s - I had tried the code button but it kept hiding all the xml in the preview area. I put the space in there so it would show up.

The end result of the xml should look like this

<person isprocessed="True" >Male</person>

Nothing fancy. Essentially I'm trying to create a simpleType with an attribute. But if I understand the W3 correctly, attributes can only be applied to complexTypes. So I tried to create a complexType with simple content inside.

+1  A: 

I suggest breaking your type into two separate types. It's clearer, and validates properly:

<xs:complexType name="Person">
    <xs:simpleContent>
        <xs:extension base="Gender">
         <xs:attribute name="isProcessed" type="xs:boolean" />
        </xs:extension>
    </xs:simpleContent>    
</xs:complexType>

<xs:simpleType name="Gender">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Male" />
        <xs:enumeration value="Female" />        
    </xs:restriction>
</xs:simpleType>

I'm not sure how to express this as a single type definition.

skaffman
+1  A: 

Well, according to the W3 Schools XML Schema Tutorial, what you're trying to do is invalid in the context of XML schema.

You can only apply a <xs:restriction> to a <xs:simpleType> - not to a <xs:simpleContent> inside a <xs:complexType>.

A <xs:simpleContent> can contain a <xs:extension> to extend a base type - but not a restriction.

So the question really is: what are you trying to accomplish here?? What's the goal, what's the XML supposed to look like that you want to validate??

Marc

UPDATE:

OK, to achieve what you want, try this - define a complex type (in order to have the attribute), which contains a simple content (so you can have the string value) and use an xs:extension in the simple content - not a xs:restriction. So basically you're defining a complex type which extends a simple string contents, and adds an attribute:

      <xs:complexType>
        <xs:simpleContent>
          <xs:extension base="xs:string">
            <xs:attribute name="isprocessed" type="xs:string" />
          </xs:extension>
        </xs:simpleContent>
      </xs:complexType>

In order to do this, I just simply created a "test.xml" file with the content you wanted, added an artificial <root>...</root> around is (so it's a valid XML document), and then I ran the Microsoft xsd.exe tool on it to create an XML schema from it (you can do the same in Visual Studio 2008, too - open an XML file and choose "XML > Create Schema" from the menu).

Hope this helps!

marc_s
What happened to the Male/Female restriction? That's surely not a part of the schema typing that can just be discarded?
skaffman
true - for that, one would need to have a simple type based on a restriction like in your example
marc_s