Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xsd xml模式-单元素和多元素出现_Xsd - Fatal编程技术网

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

Xsd xml模式-单元素和多元素出现,xsd,Xsd,我有一个XML模式,其中包含“video”元素和“youtube”元素: <xs:element name="video"> <xs:complexType> <xs:sequence> <xs:element ref="youtube" minOccurs="0" maxOccurs="1"/> </xs:sequence> <xs:attribu

我有一个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>

我想在可用的视频类型中添加另一个元素“param”:


我会在“youtube”旁边放上“param”元素

限制:

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

<video>
<youtube file = "aaa"/>
<param name="a1" value"b1"/>
<param name="a2" value"b2"/>
</video>
<xs:sequence>     
      <xs:element ref="youtube" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="param" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>    

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

如果我这样做:

<video>
<youtube file = "aaa"/>
<param name="a1" value"b1"/>
<param name="a2" value"b2"/>
</video>
<xs:sequence>     
      <xs:element ref="youtube" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="param" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>    

如果序列是这样指定的

<xs:sequence>     
      <xs:element ref="youtube" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="param" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>    

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

这里是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>

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


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

换句话说,没有100%使用XMLSchema1.0的解决方案。如果以上内容还不够,您可以使用另一种模式语言,如RELAXNG或Schematron

编辑:

在XML模式1.1(XML模式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>


如果我有这样的xml怎么办:我将xs:sequence更改为xs:choice。还有xs:all,但它将param元素的基数限制为0或1。指定的引用有什么问题?:具有隐式minOccurs=“1”和maxOccurs=“1”(默认值)。这意味着您只有一个选择:一个youtube元素或任意数量的param元素,但不能两者兼而有之。