具有属性和子元素的XSD元素
问题描述:
我想知道定义包含属性和子元素(如果可能)的元素的正确语法。例如:具有属性和子元素的XSD元素
<component type="A" binding="B">
<operation name="X">
<input type="C" />
</operation>
<event name="Y">
<output type="D" />
</event>
</component>
如您所见,元素组件,操作和事件都具有属性和子元素。可以在XSD中定义这个吗?怎么样?
非常感谢!
答
这是定义与您的XML匹配的XSD的一种可能方式;学习XSD时,您可以从一个或多个XML示例文件开始注册一个工具的帮助,该工具可为您推演XSD。
<?xml version="1.0" encoding="utf-8"?>
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="component">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="operation">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="input">
<xsd:complexType>
<xsd:attribute name="type" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
<xsd:element name="event">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="output">
<xsd:complexType>
<xsd:attribute name="type" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="type" type="xsd:string" use="required" />
<xsd:attribute name="binding" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
如你演练此,可能会开始调整分钟/ maxOccurs的,使用(需要/可选),再利用定义等所产生的XSD是一个很好的起点,但通常最终被编辑的一种方式或另一...
答
我给下面,一个可行的解决方案:
<xs:simpleType name="inputTypeType">
<xs:restriction base="xs:string" />
</xs:simpleType>
<xs:complexType name="inputType">
<xs:attribute name="type" type="inputTypeType"/>
</xs:complexType>
<xs:simpleType name="operationNameType">
<xs:restriction base="xs:string" />
</xs:simpleType>
<xs:complexType name="operationType">
<xs:sequence>
<xs:element name="input" type="inputType" />
</xs:sequence>
<xs:attribute name="name" type="operationNameType"/>
</xs:complexType>
<xs:simpleType name="outputTypeType">
<xs:restriction base="xs:string" />
</xs:simpleType>
<xs:complexType name="outputType">
<xs:attribute name="type" type="outputTypeType"/>
</xs:complexType>
<xs:simpleType name="eventNameType">
<xs:restriction base="xs:string" />
</xs:simpleType>
<xs:complexType name="eventType">
<xs:sequence>
<xs:element name="output" type="outputType" />
</xs:sequence>
<xs:attribute name="name" type="eventNameType"/>
</xs:complexType>
<xs:simpleType name="typeType">
<xs:restriction base="xs:string" />
</xs:simpleType>
<xs:simpleType name="bindingType">
<xs:restriction base="xs:string" />
</xs:simpleType>
<xs:complexType name="componentType">
<xs:sequence>
<xs:element name="operation" type="operationType" />
<xs:element name="event" type="eventType" />
</xs:sequence>
<xs:attribute name="type" type="typeType"/>
<xs:attribute name="binding" type="bindingType"/>
</xs:complexType>
<xs:element name="component" type="componentType" />
我认为它的要求'XSD:sequence'到来之前'XSD:attribute's。 – 2014-01-28 18:43:57
是的,正好与你期望的相反,因为在实际的xml中,属性出现在元素之前。 – 2014-03-18 02:12:10
来自XML Schema设计师的糟糕的设计决策,使得XSD更难以阅读,除了直观。 complexType中应该允许以任何顺序放置属性和顺序等 – 2014-09-26 03:26:13