Je veux connaître la syntaxe correcte pour définir un élément contenant à la fois des attributs et des éléments enfants (si possible). Par exemple:
<component type="A" binding="B">
<operation name="X">
<input type="C" />
</operation>
<event name="Y">
<output type="D" />
</event>
</component>
Comme vous pouvez le voir, les deux éléments composant, opération et événement ont à la fois des attributs et un élément enfant. Est-il possible de définir cela en XSD? Comment?
Merci beaucoup!
C'est une façon possible de définir un XSD correspondant à votre XML; lors de l'apprentissage de XSD, vous pouvez inscrire l'aide d'un outil qui déduit le XSD pour vous, à partir d'un ou plusieurs fichiers d'exemple XML.
<?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>
Au cours de cette procédure, vous pouvez commencer à peaufiner min/maxOccurs, utiliser (requis/facultatif), réutiliser des définitions, etc. Un XSD généré est un bon point de départ, mais finit généralement par être modifié d'une manière ou d'une autre ...
Je donne ci-dessous, une solution qui fonctionne:
<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" />