对自定义XSD子类型的限制

对自定义XSD子类型的限制,xsd,attributes,Xsd,Attributes,我创建了一个XSD子类型,如下所示: <xs:comlpexType name=”sub_aspect”> <xs:comlpexContent> <xs:extension base=”aspect”> <xs:attribute name=”id” type=”xs:boolean” /> </xs:extension> </xs:complexConte

我创建了一个XSD子类型,如下所示:

<xs:comlpexType  name=”sub_aspect”>
    <xs:comlpexContent>
       <xs:extension  base=”aspect”>
          <xs:attribute  name=”id”  type=”xs:boolean” />
       </xs:extension>
    </xs:complexContent>
  </xs:complexType>

此子类型增加了
具有“id”属性的可能性

现在,我想在标记中使用它两次,但它必须是一次true和一次onefalse(顺序并不重要):


...
一些内容
...
...
一些内容
...

这将如何在XSD中指定?

根据您的需求,可以通过约束使用XSD 1.0实现您的场景

  • maxOccurs确保了“两次”约束
  • xsd:key确保“一次正确,一次错误”
以下是相关部分的模型:

<?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="parent">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="aspect" maxOccurs="2">
                    <xsd:complexType>
                        <xsd:attribute name="id" type="xsd:boolean" use="required"/>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:key name="PK">
            <xsd:selector xpath="aspect"/>
            <xsd:field xpath="@id"/>
        </xsd:key>
    </xsd:element>
</xsd:schema>


一条不相关的建议:尽量避免对id属性使用布尔值

根据您的需求,可以通过约束使用XSD 1.0实现您的场景

  • maxOccurs确保了“两次”约束
  • xsd:key确保“一次正确,一次错误”
以下是相关部分的模型:

<?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="parent">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="aspect" maxOccurs="2">
                    <xsd:complexType>
                        <xsd:attribute name="id" type="xsd:boolean" use="required"/>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:key name="PK">
            <xsd:selector xpath="aspect"/>
            <xsd:field xpath="@id"/>
        </xsd:key>
    </xsd:element>
</xsd:schema>


一条不相关的建议:尽量避免对id属性使用布尔值

您必须使用
XSD-1.1
。您必须使用
XSD-1.1
。谢谢你的回答!为什么我应该避免对if属性使用布尔值?还有一件事。我需要它是一个子类型,因为我并不总是需要“id”属性,所以整个问题只针对sub_aspect子管道。我是否应该将上面的xsd:key结构集成到子类型扩展中?如何做到这一点?@user5040728 1)许多作者倾向于给出
id
的含义。如果将
id
视为唯一标识符,则具有两个可能值的域的类型是相当不寻常的。2) 类型/子类型不重要:约束仅在元素下工作,因此只要您为包含方面的元素定义它们,就应该可以了。谢谢您的回答!为什么我应该避免对if属性使用布尔值?还有一件事。我需要它是一个子类型,因为我并不总是需要“id”属性,所以整个问题只针对sub_aspect子管道。我是否应该将上面的xsd:key结构集成到子类型扩展中?如何做到这一点?@user5040728 1)许多作者倾向于给出
id
的含义。如果将
id
视为唯一标识符,则具有两个可能值的域的类型是相当不寻常的。2) 类型/子类型不重要:约束仅在元素下工作,因此只要为包含方面的元素定义它们,就可以了。