XSD验证 - SEQUENCE中的任何一个(“独特粒子归因”)

时间:2016-11-10 12:55:06

标签: xml xsd xsd-validation

我有以下XSD架构:

<xsd:schema xmlns="http://www.mynamespace.test/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.mynamespace.test/" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xsd:include schemaLocation="../Components.xsd"/>
    <xsd:element name="PO" type="POType"/>
    <xsd:complexType name="POType">
        <xsd:sequence>
            <xsd:element ref="PA" maxOccurs="unbounded"/>
            <xsd:element ref="PB" maxOccurs="unbounded"/>
            <xsd:any minOccurs="0" />
        </xsd:sequence>
        <xsd:attributeGroup ref="SomeAttrGroup"/>
        <xsd:attributeGroup ref="SomeOtherAttrGroup"/>
    </xsd:complexType>
</xsd:schema>

我基本上想要确保我的PO元素包含PA元素和PB元素(PB之前的PA),其中允许在PA前面,PA和PB之间以及PB之后有任何类型的元素。 .. 我尝试在所有这些地方添加xsd:any,但由于“Unique Particle Attribution”,即使只有其中一个也不可能。

我理解为什么会引发错误(无法区分现有的PB元素属于任何部分或序列中的实际PB)。但我认为没办法如何实现我真正想要的东西:它是否可能,以及它将如何实现?

PS:ANY元素可以与PA和PB元素位于同一名称空间中,而不是PA / PB元素本身。

2 个答案:

答案 0 :(得分:2)

  

我基本上想确保我的PO元素包含PA   元素和PB元素(PB之前的PA),其中有任何一种   元素允许在PA之前,在PA和PB之间以及之后   PB ...

您无法在XSD 1.0中执行此操作,但您可以在XSD 1.1中执行此操作,因为它具有宽松的独特粒子归因要求:

<xsd:schema xmlns="http://www.mynamespace.test/"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            targetNamespace="http://www.mynamespace.test/" 
            elementFormDefault="qualified"
            attributeFormDefault="unqualified"
            xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
            vc:minVersion="1.1">
    <xsd:include schemaLocation="../Components.xsd"/>
    <xsd:element name="PO" type="POType"/>
    <xsd:complexType name="POType">
        <xsd:sequence>
            <xsd:any minOccurs="0" />
            <xsd:element ref="PA" maxOccurs="unbounded"/>
            <xsd:any minOccurs="0" />
            <xsd:element ref="PB" maxOccurs="unbounded"/>
            <xsd:any minOccurs="0" />
        </xsd:sequence>
        <xsd:attributeGroup ref="SomeAttrGroup"/>
        <xsd:attributeGroup ref="SomeOtherAttrGroup"/>
    </xsd:complexType>
</xsd:schema>

答案 1 :(得分:0)

事实证明这在XSD 1.0中是不可能的,我进一步研究了XSD 1.1的功能。

我要感谢kjhughes的答案(有效,但是当有大量序列时,用户不太友好,......)并指出我正确的方向,但事实证明XSD 1.1有一些东西特别为这种行为而设计:

OpenContents (请参阅:XML Schema 1.1, Part 3: An introduction to XML Schema 1.1,此答案在此处:How to ignore the validation of unknown tags

要允许未知元素,您可以在complexType上使用int font_height=13, font_width=?; cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, font_width * pic_width_in_chars, font_height * pic_height_in_chars ); cairo_t *cr = cairo_create(surface); cairo_select_font_face(cr, "Consolas", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_set_font_size( cr, font_height ); // fill surface by characters, no need help

org.eclipse.ui.help.aboutAction

指定模式Open Content以允许未知元素位于其间的任何位置,或<xsd:complexType name="CatalogEntry"> <xsd:openContent mode="interleave"> <xsd:any namespace="##any" processContents="skip"/> </xsd:openContent> <xsd:sequence> <xsd:element name="artist" type="xsd:string"/> <xsd:element name="album" type="xsd:string"/> <xsd:element name="price" type="xsd:decimal"/> <xsd:element name="release_date" type="xsd:dateTime"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:string"/> </xsd:complexType> 仅允许序列末尾的元素。

还可以选择为整个架构指定interleave

suffix