我正在用XSD定义一个用户元素.对于此示例,用户具有姓名,电子邮件和一个或多个国籍.我试过了:
<xs:all>
<xs:element name="name" blabla />
<xs:element name="email" blabla />
<xs:element name="nationality" minOccurs="1" maxOccurs="unbounded" />
</xs:all>
Run Code Online (Sandbox Code Playgroud)
但是,这是非法的.显然,"全部"中的元素只能出现一次(或根本不出现).我可以通过将All更改为Sequence来解决这个问题,但是人们必须按照确切的顺序输入属性,我实际上并不关心.
有这两种组合可用吗?不是根据http://www.w3schools.com/Schema/schema_complex_indicators.asp,但也许它是隐藏的(或者我没有经验的眼睛看不到它).
通过直觉,我也尝试过:
<xs:all>
<xs:element name="name" blabla />
<xs:element name="email" blabla />
<xs:sequence>
<xs:element name="nationality" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:all>
Run Code Online (Sandbox Code Playgroud)
但遗憾的是,这无效.
这是当前的,真实的XSD:
<!-- user -->
<xs:complexType name="user">
<xs:sequence>
<xs:element name="firstname" type="xs:string" minOccurs="1" maxOccurs="1" />
<xs:element name="appendix" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="lastname" type="xs:string" minOccurs="1" maxOccurs="1" />
<xs:element name="address" type="xs:string" minOccurs="1" maxOccurs="1" />
<xs:element name="zipcode" type="xs:string" minOccurs="1" maxOccurs="1" />
<xs:element name="city" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:element name="username" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:element name="email" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:element name="country" type="country" minOccurs="1" maxOccurs="1"/>
<xs:element name="nationality" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)
mar*_*c_s 21
你能把你的"国籍"东西变成自己的complexType,然后在你的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>
Run Code Online (Sandbox Code Playgroud)
我手边没有任何东西来测试这个,所以这真的是我的头顶.....试一试!
编辑:现在测试它 - 它工作,唯一的小代价是你的XML必须看起来像这样:
<....>
<email>......</email>
<nationalities>
<nationality>ABC</nationality>
<nationality>CDE</nationality>
</nationalities>
<name>.....</name>
</.....>
Run Code Online (Sandbox Code Playgroud)
因此,您将获得一个包含任意长<nationality>项列表的额外节点.
渣
fan*_*ter 20
只是遇到一个类似的问题(我希望任何顺序都有任意数量的每个元素)并用一系列选择解决它.使用上面的例子:
<?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>
Run Code Online (Sandbox Code Playgroud)
这允许您以任何顺序拥有任意数量的姓名,电子邮件和国籍.
我认为你所寻找的东西会违背XML的意图.拥有这样的有效XML片段似乎很奇怪:
<user>
<nationality/>
<name/>
<nationality/>
<email/>
<nationality/>
</user>
Run Code Online (Sandbox Code Playgroud)
听起来你要求像marc_s提出的那样:
<user>
<name/>
<email/>
<nationality/>
<nationality/>
<nationality/>
<user>
Run Code Online (Sandbox Code Playgroud)
需要被推入:
<user>
<name/>
<email/>
<nationalities>
<nationality/>
<nationality/>
<nationality/>
</nationalities>
<user>
Run Code Online (Sandbox Code Playgroud)
您的代码应该在 XSD 1.1 中有效。对于 XSD 1.0,您必须找到解决方法。