Middle way between XSD all and XSD sequence

后端 未结 7 1892
故里飘歌
故里飘歌 2020-11-30 05:03

I\'m defining a user element with XSD. For this example, a user has a name, email and one or more nationalities. I\'ve tried:


  

        
相关标签:
7条回答
  • 2020-11-30 05:17

    Or, since "USER" will be set up with multiple child elements, why not set it up as a complex type? Something like this should work.

    <xs:complexType>
      <xs:sequence>
        <xs:element name="Name" type="xs:string" />
        <xs:element name="Password" type="xs:string" />
        <xs:element minOccurs="1" maxOccurs="unbounded" name="Nationality" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
    
    0 讨论(0)
  • 2020-11-30 05:20

    I think what you're looking for would go against the intent of XML. It would seems strange to have a valid XML fragment like this:

    <user>
      <nationality/>
      <name/>
      <nationality/>
      <email/>
      <nationality/>
    </user>
    

    It sounds like you're asking for something like what marc_s proposed:

    <user>
      <name/>
      <email/>
      <nationality/>
      <nationality/>
      <nationality/>
    <user>
    

    which needs to get pushed into:

    <user>
      <name/>
      <email/>
      <nationalities>
         <nationality/>
         <nationality/>
         <nationality/>
      </nationalities>
    <user>
    
    0 讨论(0)
  • 2020-11-30 05:20

    xs:choice wont work? If not, just wrap that in a sequence or vice versa.

    0 讨论(0)
  • 2020-11-30 05:21

    For XSD 1.0 the suggestion from leppie works.

    The XSD

    <?xml version='1.0' encoding='UTF-8'?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name='user'>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string" />
            <xs:element name="email" type="xs:string" />
            <xs:choice minOccurs='0' maxOccurs='unbounded'>
              <xs:element name="nationality" />
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    A sample XML document that validates against the schema

    <user>
      <name>Name</name>
      <email>name@name.com</email>
      <nationality>Italian</nationality>
      <nationality>Japanese</nationality>
      <nationality>Alien</nationality>
    </user>
    

    And validation e.g. using xmllint

    xmllint --noout --schema test.xsd test.xml
    test.xml validate
    
    0 讨论(0)
  • 2020-11-30 05:27

    Could you just turn your "nationality" thingie into its own complexType and then use that new complex type inside your xs:all?

    <xs:complexType name="NationalityType">
      <xs:sequence>   
        <xs:element name="nationality" minOccurs="1" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:complexType>
    
    <xs:all>
      <xs:element name="name" blabla />
      <xs:element name="email" blabla />
      <xs:element name="nationalities" type="NationalityType" />
    </xs:all>
    

    I don't have anything at hand to test this, so this is really just off the top of my head..... give it a try!

    EDIT: tested it by now - it works, the only minor price to pay is that your XML will have to look something like this:

    <....>
      <email>......</email>
      <nationalities>
        <nationality>ABC</nationality>
        <nationality>CDE</nationality>
      </nationalities>
      <name>.....</name>
    </.....>
    

    So you get an extra node that will contain the arbitrary long list of <nationality> items.

    Marc

    0 讨论(0)
  • 2020-11-30 05:35

    Just come across the a similar problem (I wanted to have any number of each element in any order) and solved it with a sequence of choices. Using the example above:

    <?xml version='1.0' encoding='UTF-8'?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name='user'>
        <xs:complexType>
          <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:choice>
              <xs:element name="name" type="xs:string" />
              <xs:element name="email" type="xs:string" />
              <xs:element name="nationality" />
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    This allows you to have any number of name, email and nationality in any order.

    0 讨论(0)
提交回复
热议问题