xml 模式 - 单元素和多元素出现

UGE*_*EEN 5 xsd

我有一个 XML 模式,里面有我的“video”元素和“youtube”元素:

<xs:element name="video">
  <xs:complexType>            
    <xs:sequence>     
      <xs:element ref="youtube" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>    
    <xs:attribute name="file" type="xs:string"/>
  </xs:complexType>  
</xs:element>
Run Code Online (Sandbox Code Playgroud)

我想向可用的视频类型添加另一个元素“参数”:

<xs:element name="param">
   <xs:complexType>
     <xs:attribute name="name" type="xs:string" use="required"/>
     <xs:attribute name="value" type="xs:string" use="required"/>
   </xs:complexType>
</xs:element>    
Run Code Online (Sandbox Code Playgroud)

我会在“youtube”旁边有“param”元素。

限制:

  • youtube 只能在我的 xml 中出现一次
  • param - 可以在我的 xml 中出现多次

像这样:

<video>
<youtube file = "aaa"/>
<param name="a1" value"b1"/>
<param name="a2" value"b2"/>
</video>
Run Code Online (Sandbox Code Playgroud)

如何在此架构中维护此限制?

如果我做这样的事情:

<xs:sequence>     
      <xs:element ref="youtube" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="param" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>    
Run Code Online (Sandbox Code Playgroud)

如果序列是这样指定的

<xs:sequence>     
      <xs:element ref="youtube" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="param" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>    
Run Code Online (Sandbox Code Playgroud)

它确定 param 必须在 youtube 之后 - 但我不想指定序列

Grz*_*ski 4

这是 XSD 架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="video">
        <xs:complexType>
            <xs:choice minOccurs="1" maxOccurs="2">
                <xs:element ref="youtube"/>
                <xs:element ref="param" minOccurs="1" maxOccurs="unbounded"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>

    <xs:element name="youtube">
        <xs:complexType>
            <xs:attribute name="file" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="param">
        <xs:complexType>
            <xs:attribute name="name" type="xs:string" use="required"/>
            <xs:attribute name="value" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

示例(格式良好且有效)XML:

<?xml version="1.0" encoding="UTF-8"?>
<video>
    <youtube file="aaa"/>
    <param name="a1" value="b1"/>
    <param name="a2" value="b2"/>
</video>
Run Code Online (Sandbox Code Playgroud)

上述解决方案存在一个问题。xs:choice 允许两个 youtube 元素。有xs:all元素可以解决这个问题,但不幸的是,用它不可能获得参数的 maxOccurs 超过一个(xs:all 限制)。

换句话说,使用 XML Schema 1.0 并不存在 100% 的解决方案。如果上述还不够,您可以使用其他模式语言,例如 RELAX NG 或 Schematron。

编辑:

在 XML Schema 1.1(XML Schema 1.0 的超集)中,您可以将视频元素编写为:

<xs:element name="video">
    <xs:complexType>
        <xs:all>
            <xs:element ref="youtube"/>
            <xs:element ref="param" minOccurs="0" maxOccurs="unbounded"/>
        </xs:all>
    </xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)

  • 我将 xs:sequence 更改为 xs:choice。还有 xs:all,但它将 param 元素的基数限制为 0 或 1。 (2认同)
  • &lt;xs:choice&gt; 具有隐式 minOccurs="1" 和 maxOccurs="1" (默认值)。这意味着您只有一种选择:一个 youtube 元素或任意数量的 param 元素,但不能同时选择两者。 (2认同)