3.3 デフォルト値の設定
属性値には、デフォルト値を設定することができます。デフォルト値を設定する際に使用する属性は、defaultです。
<attribute name="属性の名前" type="属性の型" default="デフォルトの値"/> <attribute ref="属性の名前" default="デフォルトの値"/>
default属性の値は、その属性が存在しなかったときに適用されます。よって、use属性の値が、optional以外であった場合は、エラーになります。以下に例を示します。country属性を少し変更します。
<xsd:attribute ref="po:country" default="US"/>
以上のように設定した場合、country属性は、「属性があったらそこに設定されている値、なければUS」になります。
また、「あってもなくても属性の値は固定」と設定したい場合は、fixed属性を使用します。
<attribute name="属性の名前" type="属性の型" fixed="属性の値"/> <attribute ref="属性の名前" fixed="属性の値"/>
fixed属性が設定されている場合、属性値がある場合は、fixed値で設定されている属性でなくてはいけません。属性値が存在しない場合は、fixedに設定されている値が属性値に設定されているものとして処理されます。fixed属性はuseの属性値がprohibitedのときは、指定できません。また、fixedとdefaultは、同時に指定することはできません。以下に例を示します。
<xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/>
以上の例では、country属性を宣言しています。fixed属性値の値が"US"であることから、「country属性が存在する場合は、値はUSでなければならない。country属性が存在しなければ、属性値がUSであるものとして処理される」という定義になります。
3.4 属性グループ
前章「9.6 モデルグループ」で、再利用を目的に、要素内容モデルの一部をグループ化する話をしました。同様に、Complex Type定義の中で何度も出現するような属性の組をグループ化することができます。これを属性グループといいます。属性グループはattributeGroup要素を使用して宣言します。
<attributeGroup name="属性グループの名前"> 属性の宣言 または属性の参照 </attributeGroup>
属性グループを参照するときは、ref属性を使用します。
<attributeGroup ref="属性グループの名前"/>
例を示します。例にあげている注文伝票の後半部分は、注文した品物に関する情報が記述されています。さらに、それぞれの品物の重さと送付方法の情報を追加しようと思います。weightKG属性とshipBy属性を追加しようと思います。そうした場合、単純にweightKG属性とshipBy属性の宣言を書き足すのではなく、属性グループを使用したいと思います。属性グループを使用して記述すると以下のようになります。
<xsd:element name="item" minOccurs="0" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="productName" type="xsd:string"/> <xsd:element name="quantity"> <xsd:simpleType> <xsd:restriction base="xsd:positiveInteger"> <xsd:maxExclusive value="100"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="USPrice" type="xsd:decimal"/> <xsd:element ref="po:comment" minOccurs="0"/> <xsd:element name="shipDate" type="xsd:date" minOccurs="0"/> </xsd:sequence> <!-- attributeGroup replaces individual declarations --> <xsd:attributeGroup ref="po:ItemDelivery"/> </xsd:complexType> </xsd:element> <xsd:attributeGroup name="ItemDelivery"> <xsd:attribute name="partNum" type="po:SKU" use="required"/> <xsd:attribute name="weightKg" type="xsd:decimal"/> <xsd:attribute name="shipBy"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="air"/> <xsd:enumeration value="land"/> <xsd:enumeration value="any"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute> </xsd:attributeGroup>
以上の例では、Complex Type型定義の中で属性宣言をしていません。その代わり、ItemDeliveryという名前の属性グループを参照しています。その下で、ItemDeliveryという属性グループを定義しています。ItemDelivery属性グループは、partNum、weightKg、shipByという3つの属性からなるグループになります。
3.5 まとめ
- 属性宣言はattribute要素によって行う
- 属性の出現回数は、use属性で指定する
- 属性のデフォルト値は、default属性およびfixed属性で指定する。
- 属性グループを定義し、属性宣言の再利用を行うことができる。