我无法验证以下内容(XSD是的,我知道)结构:
<Mappings>
<Mapping name="foo" type="bar">a string</Mapping>
<Mapping name="Model" type="TableMapping" valueformat=">
<Entry expression="some expression" value="some value"/>
<Entry expression="some other expression" value="some other value"/>
</Mapping>
</Mappings>
为此我有这个架构:
<xs:complexType name="Mappings">
<xs:sequence>
<xs:element name="Mapping" maxOccurs="unbounded" minOccurs="1">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="name"/>
<xs:attribute type="AllowedMappingTypes" name="type"/>
<xs:attribute type="xs:string" name="valueformat"/>
</xs:extension>
</xs:simpleContent>
<xs:element name="Entry" maxOccurs="unbounded" minOccurs="1">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:sequence>
<xs:attribute type="xs:string" name="expression"/>
<xs:attribute type="xs:string" name="value"/>
</xs:sequence>
</xs:extension>
</xs:simpleContent>
</xs:element>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
即。 Mapping元素可以在其中包含Entry元素,但这不是必需的。验证因格式错误而失败:
XMLSchemaParseError: Element'{http://www.w3.org/2001/XMLSchema}complexType': The content is not valid. Expected is (annotation?, (simpleContent | complexContent | ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?))))., line 121
这一行:
<xs:element name="Entry" maxOccurs="unbounded" minOccurs="1">
所以我的问题是;如何正确编写XSD以便能够使用属性列表和具有某些特定属性的可选条目进行映射?我相信这可能很简单,但我缺乏..尝试重新组织标签并尝试不同的标签,但它不起作用。 此致
答案 0 :(得分:1)
以下代码似乎可以很好地解决我的问题。应该始终记住通过XSD生成器运行代码!显然,您需要在标记中使用<complexType mixed="true">
来允许元素内的元素和属性。
<xs:complexType name="Mappings">
<xs:sequence>
<xs:element name="Mapping" maxOccurs="unbounded" minOccurs="0">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="Entry" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="expression" use="optional"/>
<xs:attribute type="xs:string" name="value" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:string" name="name" use="optional"/>
<xs:attribute type="AllowedMappingTypes" name="type" use="optional"/>
<xs:attribute type="xs:string" name="valueformat" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>