XSD all和XSD序列之间的中间路径

Bar*_*lom 25 xml xsd

我正在用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>项列表的额外节点.

  • 这个答案是唯一正确的答案.你需要的是一系列国籍.所有其他方法都只是违反XML原则的黑客攻击. (4认同)

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)

这允许您以任何顺序拥有任意数量的姓名,电子邮件和国籍.

  • 但是这会在<user />中允许多个<name />元素? (7认同)

Jer*_*ein 7

我认为你所寻找的东西会违背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)


jel*_*irt 3

您的代码应该在 XSD 1.1 中有效。对于 XSD 1.0,您必须找到解决方法。

  • 如何使用、制定、选择加入、创建、隐藏、迁移、实例化、查找或执行 XSD 1.1? (28认同)
  • 您能否列举一下 XSD 1.1 和 XSD 1.0 之间的区别,即它在 1.1 中有效而在 1.0 中无效? (3认同)