我有以下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元素本身。
答案 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