如何指定(XSD)元素具有子标记或简单内容,但不能同时具有二者

如何指定(XSD)元素具有子标记或简单内容,但不能同时具有二者,xsd,Xsd,编辑:这不是我上一个问题的翻版,因为我不想再同时做这两个问题了 我想指定我的设置节点具有以下任一项: <setting name='Some Setting'> SomeData </setting> 一些数据 架构是: <xs:element name="setting"> <xs:complexType> <xs:simpleContent> <xs:ex

编辑:这不是我上一个问题的翻版,因为我不想再同时做这两个问题了

我想指定我的设置节点具有以下任一项:

   <setting name='Some Setting'>
      SomeData
    </setting>

一些数据
架构是:

  <xs:element name="setting">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:string">
          <xs:attribute name="name" type="xs:string" use="required" />
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>

  <setting name='Some Setting'>
    <value>SomeData</value>
  </setting>

一些数据
架构是:

<xs:element minOccurs="0" name="setting">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="value" type="xs:string" />
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required" />
  </xs:complexType>
</xs:element>

但不是两者都有。


我不知道如何在整个模式中组合它们。我尝试过使用
,但这抱怨说同名的元素需要具有相同的类型这些类型的限制无法在XSD中描述,您需要使用另一种语言来建模,例如schematron。

这些类型的限制无法在XSD中描述,您需要使用另一种语言对它们进行建模,例如schematron。

我认为最接近的方法是使用
mixed=“true”
,如下所示:

<xs:complexType>
  <xs:sequence>
    <xs:element name="setting">
      <xs:complexType mixed="true">
        <xs:sequence>
          <xs:element name="value" type="xs:string" minOccurs="0" />
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required" />
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>
  • 仅子元素:

    <setting name="Some Setting">
      <value>SomeData</value>
    </setting> 
    
    
    一些数据
    
  • 两者:

    <setting name="Some Setting">
      Some Data
      <value>SomeData</value>
    </setting>
    
    
    一些数据
    一些数据
    

  • (3)的可能性肯定不理想,但我认为你无法避免。你需要有一个规则来处理这种情况。我认为合理的规则是:如果存在
    元素,则使用
    标记之间的数据,否则使用
    设置
    标记之间的数据。

    我认为最接近的方法是使用
    mixed=“true”
    ,如下:

    <xs:complexType>
      <xs:sequence>
        <xs:element name="setting">
          <xs:complexType mixed="true">
            <xs:sequence>
              <xs:element name="value" type="xs:string" minOccurs="0" />
            </xs:sequence>
            <xs:attribute name="name" type="xs:string" use="required" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    
  • 仅子元素:

    <setting name="Some Setting">
      <value>SomeData</value>
    </setting> 
    
    
    一些数据
    
  • 两者:

    <setting name="Some Setting">
      Some Data
      <value>SomeData</value>
    </setting>
    
    
    一些数据
    一些数据
    

  • (3)的可能性肯定不理想,但我认为你无法避免。你需要有一个规则来处理这种情况。我认为合理的规则是:如果存在
    元素,则使用
    标记之间的数据,否则使用
    设置
    标记之间的数据。

    谢谢您的回答。我今天要试试这个。我知道不鼓励使用混合节点,但对我来说这似乎是最好的解决方案。谢谢您的回答。我今天要试试这个。我知道不鼓励使用混合节点,但对我来说这似乎是最好的解决方案。