XSD限制与特定属性元件发生(XSD restrict element occurrence wit

2019-11-01 18:08发布

我试图定义一个复杂类型的选择,可以由不同类型的条目,但只有一个入口,允许有一个属性“多选”。

这里是我的尝试:

<element name="selection" minOccurs="0" maxOccurs="unbounded">
  <complexType>
    <sequence>
      <element name="name" type="string" />
      <element name="source">
        <complexType>
          <choice>
            <element name="item" minOccurs="1" maxOccurs="unbounded" type="string" />
            <element name="path" type="string" minOccurs="1" maxOccurs="1" />
          </choice>
        </complexType>  
      </element>
    </sequence>
    <attribute name="multiselection" type="boolean" minOccurs="1" maxOccurs="1" />
  </complexType>
</element>

结果应该是,有可能是“选择”更多的元素,其中如果源类型“项”或类型的“路径”的也没关系。 但只有“选择”的内容之一是允许有属性多选=真。

但是,因为它似乎没有用于属性没有MIN- / maxOccures。 我怎样才能解决这个?

谢谢

Answer 1:

首先,最小/ maxOccurs的被保留用于颗粒(本地元素,元素的引用,组参考文献,序列,选择)。 一个属性出现由控制

使用=(可选|禁止|必需的) -默认值是可选

为了进一步约束是一组元素中,只有一个可能有真正的逻辑值(1或文本指定的属性true ) -这是你不能XSD 1.0独自完成。 您可以XSD的顶部使用的Schematron。

或者,你可以很容易地在XSD 1.1实现这一目标。

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="sample">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="selection" minOccurs="0" maxOccurs="unbounded">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="name" type="xsd:string"/>
                            <xsd:element name="source">
                                <xsd:complexType>
                                    <xsd:choice>
                                        <xsd:element name="item" minOccurs="1" maxOccurs="unbounded" type="xsd:string"/>
                                        <xsd:element name="path" type="xsd:string" minOccurs="1" maxOccurs="1"/>
                                    </xsd:choice>
                                </xsd:complexType>
                            </xsd:element>
                        </xsd:sequence>
                        <xsd:attribute name="multiselection" type="xsd:boolean" use="required"/>                        
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
            <xsd:assert test="count(selection[@multiselection=true()])=1"/>         
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

沿着这些线路(包括虚假或两者真会失败验证)的东西:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<sample xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <selection multiselection="false">
        <name>name1</name>
        <source>
            <item>item1</item>
            <item>item1</item>
        </source>
    </selection>
    <selection multiselection="false">
        <name>name1</name>
        <source>
            <item>item1</item>
            <item>item1</item>
        </source>
    </selection>
</sample>


cvc-assertion.3.13.4.1: Assertion evaluation ('count(selection[@multiselection=true()])=1') for element 'sample' with type '#anonymous' did not succeed. 

使他们的一个true应该得到成功验证。



文章来源: XSD restrict element occurrence with an specific attribute
标签: xml xsd xsd-1.1