XML基本事項

(参考文献)10日でおぼえるXML入門教室 山田祥寛

 

XML (eXtensible Markup Language):情報記述言語

SGML (Standard Generalized Markup Language)

DTD (Document Type Definition):文書型定義

XSLT (eXtensible Stylesheet Language Transformations)

PI (Processing Instruction):処理命令

XMLパーサや、ブラウザなどの処理アプリケーションに対して、XML文書からの命令を示すもの。

<? ~ ?>で囲まれた部分で、XML文書の先頭に記述される。

 

XMLの基本:

先頭には、<?xml ~ ?>宣言が必要(推奨?)

唯一のルート要素が必要

要素同士は正しく入れ子にする必要がある

終了タグは省略できない

タグの大文字と小文字は正しく対応させる

属性値は必ずダブルクォーテーションで囲む

属性値の省略形は使えない

 

 

XSLT

XSLTスタイルシート:

マークアップ言語でありながら、XMLを見栄えのよいフォーマットに整えるための機能を持つ言語

XML文書:

type属性:スタイルシートの形式を指定、必須。

href属性:スタイルシートを核のした場所を示す、必須。

 

XSLT文書:

<xsl:stylesheet>要素:

<xsl:output>要素:XSLTの出力形式(method="xml | html | text"など)を宣言する

<xsl:template>要素:XMLに対して適用される一連のスタイル規則(テンプレート)を定義する。

match属性:そのテンプレートがXMLのどの要素に対して適用されるのか。例えばmatch="/"は文書全体を示す。

XSLTスタイルシートにおいては、必ず一番最初に「ルート要素に適用されるテンプレート」が呼び出される。

XSLTスタイルシートの内部には少なくとも一つテンプレートが存在し、XML文書のルート要素に適用されるテンプレートは省略することが出来ない。

<xsl:text>要素:固定的なテキスト表示(省略可能)

<xsl:value-of>要素:select属性で指定された値の内容を取得し、出力する

 

要素や属性までの経路はxPathという規格であらわされる。

例)

/             直下の要素

//            全ての子孫

.             現在の要素

*             全ての子要素

@           属性名の接頭辞

:             名前空間セパレータ

 

CSSファイル読み込み:

<link rel="stylesheet" type="text/css" href="参照先"/>

 

外部テンプレートの適用:

<xsl:stylesheet>

要素の中に、

<xsl:apply-template select="適用ノード"/>

が登場すると、その適用ノードには...

<xsl:template match="適用ノード">...

配下に書かれているテンプレートが適用される。

なお、ジャンプ先のテンプレートでは、この適用ノードがカレントノードとなるので、そのテンプレート内での要素記述が簡素化される。

 

注)テンプレートは入れ子にすることは出来ない。

 

繰り返し:

<xsl:for-each select="対象要素">

<xsl:for-each>要素もまた、カレントノードを"対象要素"に移動させる。

 

ソート:

<xsl:sort select="対象要素" data-type"(text | number)" order="ソートの種類(ascending | descending)">

要素にて、<xsl:for-each>繰り返し処理の出力順序を、それぞれの出力要素についてソートすることができる。

 

リンクの生成:

<xsl:element name="a">

              <xsl:attribute name="href">

                            <xsl:value-of select="リンク先urlの要素" />

              </xsl:attribute>

              <xsl:value-of select="リンク先文字列の要素" />

</xsl:element>

HTMLに変換すると、

<a href="リンク先urlの要素の値">リンク先文字列の要素の値</a>

となり、<a>タグの出力が可能。

 

条件分岐:

<xsl:choose>

              <xsl:when test="price[number(.) &lt;= 3000]">

                            <span style="font-weight:bold;">

                                          <xsl:value-of select="price" />

                            </span>

              </xsl:when>

              <xsl:otherwise>

                            <xsl:value-of select="price" />

              </xsl:otherwise>

</xsl:choose>

[]:フィルタパターン。ここに論理式を書いて、test属性に真偽値を渡す。

number()xPath関数の一つで、引数に指定した要素を数値化する。引数にはxPathで表される要素を取る。

&lt;=XSLTの中では不等号である、<記号はタグを囲む特別な意味を持つため、そのままでは使用できないのでエスケープしたコードを用いて表す。

 

<xsl:if test=”条件式”>

  条件式がtrueの場合に出力される内容

</xsl:if>

 

数値の整形:

format-number(要素,’フォーマット’)”

例)

<xsl:value-of select="format-number(price, '#,###')"/>

 

画像の表示:

<xsl:element name="img">

              <xsl:attribute name="src">

                            <xsl:value-of select="ソースを格納する要素" />

              </xsl:attribute>

              <xsl:attribute name="width">120</xsl:attribute>

              <xsl:attribute name="height">150</xsl:attribute>

</xsl:element>

HTMLに変換すると、

<img src="ソースを格納する要素の値" width="120" height="150">

 

ノード表現:

text()                     平のテキスト

comment()             コメントノード

node()                   全種類のノード

processing-instructions()

                            処理命令のノード

 

連番表示:

<xsl:number [level="ナンバリングのレベル"] [count="カウントする対象を特定するためのxPath"] [from="どこからカウントを始めるかの指定"] [format="出力形式]/>

 

変数定義:

<xsl:variable name=”変数名”></xsl:variable>

で変数の定義ができ、$変数名で変数の値が参照できる。

 

属性定義のまとめ:

<xsl:attribeute-set name=”属性定義名”>

 <xs:attribute …>

</xsl:attribeute-set

として、一連の定義に名前をつけておくて、別の箇所で自由に参照できる。

例)

<table xsl:use-attribute-sets="属性定義名">

 

 

数値でない場合のフォーマット定義:

format-number関数で指定された値が数値でない場合、指定した文字列を表示する。

<xsl:decimal-format NaN=”-“>

 

外部XSLTの利用:

<xsl:include href=”呼び出すスタイルシートのパス”/>

 

 

DOM

XMLDOMDocument2オブジェクトを新規生成する式:

var objDoc=new ActiveXObject("Msxml2.DOMDocument");

objDoc.async=false;

objDoc.load("books.xml");

window.alert(objDoc.xml);

注1)ActiveXObjectオブジェクトのxmlプロパティは、オブジェクトの内容をXML文書のまま表示するためのプロパティ(デバッグに便利)。xmlファイルの拡張子ではありません。

注2)ActiveXObjectオブジェクトのtextプロパティは、オブジェクトの内容をテキストとして表示するためのプロパティ。

注3)通常リモートにあるXML文書の呼び出しは同期で行わないとエラーが発生するおそれがあるので、同期呼び出し(objDoc.async=false)としている。

 

ルート要素の取得;

var objRoot=objDoc.documentElement;

要素ノードを表すXMLDOMNodeオブジェクトを返す。

 

子要素群の取得:

var clnCld=objRoot.childNodes;

XMLDOMNodeの集合体であるXMLDOMNodeListオブジェクトを返す。

 

ノードの抽出:

for (i=0;i<clnCld.length;i++) {

  var objNod=clnCld.item(i);

  window.alert(objNod.xml);

}

itemメソッドはXMLDOMNodeList内のXMLDOMNodeオブジェクトを返す。

 

(別の方法)

var objCld=objRoot.firstChild;

while (objCld != null) {

       window.alert(objCld.xml);

       var objCld = objCld.nextSibling

}

 

親要素へのアクセス:

var objParent = objRoot.firstChild.parentNode

window.alert(objParent.xml);

最初の子供の要素の親の要素(つまり自分)にアクセス

 

属性の取得:

0)    attributes

ノードの全属性を含むXMLDOMNamedNodeMapを返す。

var clnAtr=objNod.attributes;

 

1)    item

XMLDOMNamedNodeMapの属性に対して、順番に取得。

var objAtr=clnAtr.item(0);

 

2) getNamedItem

XMLDOMNamedNodeMapの属性に対して、名前を指定して取得。

var objAtr=clnAtr.getNamedItem("isbn");

 

3) getQualifiedItem

2引数に名前空間を指定。

var objAtr=clnAtr.getQualifiedItem("isbn", "");

 

4) getAttributeNode

属性ノードに直接アクセス。

var objAtr=objNod.getAttributeNode("isbn");

 

5) getAttribute

ノード内の属性に直接アクセス。

objNod.getAttribute("isbn")

 

要素の取得:

1) selectNodes

XMLDOMNode.selectNodes("xPath");

で要素への直接アクセスが可能。

 

2)    getElementsByTagName

var clnSrt=objDoc.getElementsByTagName("xsl:stylesheet//xsl:sort");

xPathで指定した要素にアクセスできる。

 

3) selectSingleNode

var objSrt=objDoc.selectSingleNode("xsl:stylesheet//xsl:sort");

で直接要素を返す。

 

要素の作成:

createElement

var objBook=objDoc.createElement(要素名);

で要素を作成する。

objBook.txt="文字列"

textプロパティの値をセットする。

 

属性の作成:

createAttribute

var objISBN=objDoc.createAttribute("isbn");

で属性を作成する。

objISBN.txt="文字列"

textプロパティの値をセットする。

 

属性を要素にセット:

1)    objBook.setAttributeNode(objISBN);

で属性を要素にセットする。

 

2)    objBook.setAttribute("isbn", "ISBN7-77777-777-7");

で新しい属性に、値をセットする。

 

要素の追加:

objRoot.appendChild(objBook);

で作成した要素を実在する要素に追加する。

 

属性の削除:

var objRoot=objDoc.documentElement;

objRoot.removeAttribute("title");

で既存の属性を削除する。

(属性削除、その他の方法)

removeQualifiedItem

removeNamedItem

removeAttributeNode

 

要素の削除:

removeChild

var clnChld=objRoot.childNodes;

objRoot.removeChild(clnChld.item(0));

で既存の要素を削除する。

 

要素の置換:

objRoot.replaceChild(objBook,objRoot.lastChild);

で要素の置換を行う。ここでは、それぞれ、

objRoot:置換したい要素の親要素

objBook:置換したい内容を持つ要素

objRoot.lastChild:置換したい要素

の役割を持つ。

 

内容の保存:

ただしクライアント環境では権限上実行できない。

objDoc.save("output.xml");

 

 

DTD

文書型定義:

<!DOCTYPE ルート要素 [

       要素および属性型定義

]>

 

要素型定義:

<!ELEMENT owner (#PCDATA)>

       要素名  データ型

owner要素には、#PCDATA(文字列)型のみが含まれる。

 

登場回数:

? 0回もしくは1回登場

* 0回以上登場

+ 1回以上登場

なし かならず1回登場

 

登場順序:

, 記述順に要素が登場する

| 並列に記述された要素がいずれか1つ登場する

 

要素データの定義:

#PCDATA       文字列

ANY           任意

EMPTY         何も含まれない

 

例)

<!ELEMENT memo (#PCDATA | keyword | ref)*>

memo要素には、#PCDATA(文字列)、keyword要素、ref要素のいずれかが複数回含まれる。つまりこれらが何回でも登場してよい。

注:()内の#PCDATAは最初に指定する必要がある。

 

属性型定義:

<!ATTLIST owner address CDATA #IMPLIED>

              要素名    属性名    データ型 デフォルト値

 

型の例

ID           一意の識別子       ただし、値はアルファベットで開始する必要がある。

 

外部DTD

<!DOCTYPE books SYSTEM "books.dtd" [

...(内部DTD記述部)

]>

 

実体参照:

繰り返し使われるデータを都度引用する仕組み

 

(宣言)

内部実体参照       <!ENTITY asp "Active Server Pages">

外部実体参照       <!ENTITY book1 SYSTEM "book1.xml">

 

(使用例)

内部実体参照       <owner address="CQW15204@nifty.com">&asp; Yoshihiro.Yamada</owner>

外部実体参照       &book1;

 

 

XML Schema

(参考URLhttp://www6.airnet.ne.jp/manyo/xml/

XMLスキーマ検証用Javaプログラムの例)http://www.itarchitect.jp/xml/-/22646.html

 

XML Schema宣言:

<?xml version="1.0" encoding="Shift_JIS" ?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

...

</xsd:schema>

ルート要素は、<xsd:schema>

 

要素の宣言:

<xsd:element name="title" type="xsd:string" />

最も単純な要素の宣言。配下に子要素を持たず、テキストのみが含まれる要素の宣言。

 

データ型:

http://www.w3.org/TR/xmlschema-2/

 

単純型要素と複合型要素:

単純型要素:内容にテキストのみを持ち、属性を持たない要素              <xsd:simpleType>

要素の宣言にも属性の宣言にも使える。

 

複合型要素:内容に子要素や属性を持つ要素                                          <xsd:complexType>

要素の宣言には使えるが、属性の宣言には使えない。

 

単純型内容を持った複合型:内容がテキストだが、属性を持つ要素

(詳細は、単純型内容を持った複合型:を参照)

 

これらを用いて型の派生を行うことができる。ここでいう派生とは、すでにある型を用いて新たな型を定義することをいう。

(逆に言うと、派生を用いなければ独自の型を定義することはできない)

例)

<xsd:element name="books">

       <xsd:complexType>

              <xsd:sequence>

                     <xsd:element name="owner" ... />

                     <xsd:element name="book" ... />

              </xsd:sequence>

              <xsd:attribute name="title" type="xsd:string" use="optional" />

       </xsd:complexType>

</xsd:element>

 

また、要素の順番を指定するのに、<xsd:sequence>が使われる。

順不同の場合、<xsd:all>が使われる。

 

厳密に単純型を書く場合、

<xsd:element name="title" type="xsd:string" />

は、

<xsd:element name="title" >

       <xsd:simpleType>

              <xsd:restriction base="xsd:string" />

       </xsd:simpleType>

</xsd:element>

と書かれる。

<xsd:restriction>

は、データの制約条件を記述するためのもので、基本データ型、値の範囲などを指定する。

 

注)<xsd:restriction>が指定された場合、型の指定はbaseで行わねばならず、<xsd:element>typeで行うとエラーになる。

 

派生の方法としては、

1.  制限(restriction

2.  ユニオン(union

3.  リスト(list

などがある。

 

制約ファセット:

具体的にどう制限するかということを表した部分を制約ファセットという。

例)

<xsd:restriction base="xsd:string">

       <xsd:maxLength value="20" />

</xsd:restriction>

この場合、文字列長の最大値は20と制限されている。

 

(制約ファセット例)

数値

-          minInclusive                   この値以上

-          maxInclusive                  この値以下

-          minExclusive                 この値より上

-          maxExclusive                この値より下

-          totalDigits                      全ての桁数の最大値

-          fractionDigits                 小数点以下の桁数の最大値

文字列

-          length                           文字列の長さ(固定長文字列)

-          minLength                     文字列の最小の長さ(可変長文字列)

-          maxLength                    文字列の最大の長さ(可変長文字列)

-           

 

要素の登場回数の制限に用いることのできる属性:

minOccurs属性:最小登場回数

maxOccurs属性:最大登場回数

数字、もしくはunboundを指定する。

 

要素型の参照:

type属性は、外部で定義した要素の型を参照することができる。

例)

(参照)

<xsd:element name="owner" type="ownerType" minOccurs="1" maxOccurs="1" />

(定義)

<xsd:complexType name="ownerType" mixed="true">

       <xsd:attribute name="address" type="xsd:string" use="required" />

</xsd:complexType>

 

注)ここのmixed="true"属性は、この型が指定された要素以外にも任意のテキストが指定できることをあらわす。

逆に、mixed="false"属性は、その型で指定された要素以外には指定できない。

 

属性の宣言:

<xsd:attribute name="address" type="xsd:string" use="required" />

use="required"は、この属性が必須であることを示す。(任意の場合、use="optional"

use="default" value="default value"

use="fixed" value=" fixed value"

などもある。

 

曖昧な要素の宣言:

データ定義のゆらぎを予め想定し、それを吸収するような文書定義を行うためのもの。

<xsd:choice>

       <xsd:element name="name" type="xsd:string" />

       <xsd:element name="title" type="xsd:string" />

</xsd:choice>

と宣言されている場合、この箇所にはname要素とtitle要素のいずれか一方が登場することができる。

 

属性グループの定義:

ある特定の属性をひとかたまりのグループとして予め定義しておき、複数個所から引用することができる。

<xsd:attributeGroup name="bookAttr">

       <xsd:attribute name="isbn" use="required">

              <xsd:simpleType>

                     <xsd:restriction base="xsd:string">

                            <xsd:pattern value="ISBN[0-9]{1}-[0-9]{5}-[0-9]{3}-[0-9]{1}" />

                     </xsd:restriction>

              </xsd:simpleType>

       </xsd:attribute>

</xsd:attributeGroup>

これはbookAttrという属性グループ定義が用いられた要素には、<xsd:attribute>以下で定義された属性(群)が適用されることを示している。

これを実際に使う箇所の記述は以下のようになる。

<xsd:attributeGroup ref="bookAttr" />

refで属性グループ定義を参照している。

 

値の候補の列挙:

ある要素、属性の値の候補を列挙することができる。

<xsd:element name="category">

       <xsd:simpleType>

              <xsd:restriction base="xsd:string">

                     <xsd:enumeration value="ASP" />

                     <xsd:enumeration value="XML" />

                     <xsd:enumeration value="JSPServlet" />

              </xsd:restriction>

       </xsd:simpleType>

</xsd:element>

categoryは、単純型要素で型は文字列に限定されている。さらに、<xsd:enumeration>要素により、取り得る値がASPXMLJSPServlet3通りに限定されている。

文字列パターンの指定:

正規表現により文字列の従う規則が指定できる。

<xsd:restriction base="xsd:string">

       <xsd:pattern value="ISBN[0-9]{1}-[0-9]{5}-[0-9]{3}-[0-9]{1}" />

</xsd:restriction>

valueに正規表現を記入すると、この指定のある要素・属性は、この正規表現に則る必要がある。

 

値リストの指定:
要素配下のテキスト、もしくは属性値として半角スペース区切りの値リストを持つことができる。

<xsd:simpleType name="authorType">

       <xsd:list itemType="xsd:string" />

</xsd:simpleType>

とすると、authorTypeという名前を持つ型(を用いる要素)は、値として文字列の値リストを持つことができるようになる。

これを以下のようにして使う。

<xsd:element name="author">

<xsd:simpleType>

              <xsd:restriction base="authorType">

                     <xsd:maxLength value="3" />

              </xsd:restriction>

       </xsd:simpleType>

</xsd:element>

authorという要素は、先の宣言から文字列の値リストを持ち、またそのリストの最大長は3となる。

 

ユニオン:

ある要素の型の候補を2つ以上取ることができる。

<xsd:simpleType name="RankingType">

       <xsd:union memberTypes="DisqualifiedType xsd:positiveInteger" />

</xsd:simpleType>

この場合、RankingType型は値の型として、DisqualifiedTypexsd:positiveIntegerの両方を取ることができる。

memberTypesの中に書く型は半角スペースで区切る。

DisqualifiedTypeの具体的な定義は以下。

<xsd:simpleType name="DisqualifiedType">

       <xsd:restriction base="xsd:string">

              <xsd:enumeration value="失格" />

       </xsd:restriction>

</xsd:simpleType>

注)ただし、IE8.0では上手く動かなかった。。

 

匿名の型定義:

XMLの型は全て定義してからでないと使えないが、匿名の型定義という記法を用いることで型名の記述することを省略することができる。

例)匿名の型定義を用いない場合

<xsd:element name="poets" type="NameType" />

 

<xsd:simpleType name="NameType">

       <xsd:restriction base="xsd:Name">

              <xsd:length value="4" />

       </xsd:restriction>

</xsd:simpleType>

注)xsd:Name型に対して文字数4の制約を加えている。

 

例)匿名の型定義を用いた場合

<xsd:element name="poets">

       <xsd:simpleType>

              <xsd:restriction base="xsd:Name">

                     <xsd:length value="4" />

              </xsd:restriction>

       </xsd:simpleType>

</xsd:element>

定義と参照の両方からNameTypeが消え、記述が1箇所にまとまっている。

実は、今まで暗黙のうちにこの匿名の型定義を使ってまとまった記述をしてきたが、ここであえて言うと全てのXMLの要素と属性には個別の型宣言とそれを用いた型の定義が必要で、それを別々に記述することもできれば、匿名の型定義を使って一箇所で行うこともできる。

 

単純型内容を持った複合型:

複合型だが、単純型に近い複合型として特別扱いされる型。

例)

<xsd:complexType name="YomiType">

       <xsd:simpleContent>

              <xsd:extension base="xsd:string">

                     <xsd:attribute name="pno" type="xsd:positiveInteger" use="required" />

              </xsd:extension>

</xsd:simpleContent>

</xsd:complexType>

単純型内容を持つ複合型として<xsd:simpleContent>が指定される。さらに内容がxsd:string型だが、この型が取る値の範囲を制限して派生させるわけではなく、属性というさらに余分な定義を加えるという意味で、これを拡張しているという。拡張は、<xsd:extension>で示される。

 

単純型内容を持った複合型の制限:

1.内容に対して制約ファセットを適用(単純型の制限と同じ)

2.属性の出現制約を強化(デフォルト値や固定値を新たに定めることも含む)

3.属性に使用されている単純型の値の範囲を狭める(optional[0,1]回を、prohibited[0]回、もしくはrequired[1]回に)

 

要素と属性のデフォルト値の扱い:

属性のデフォルト値は、その属性の出現がない場合に、実はその属性が存在し、その値をその属性のデフォルト値とする。

しかし要素については、その要素が存在しない場合は単にその要素が存在しないと見なされる。

その要素が存在し、その値がない場合に初めて、その要素の値としてその要素のデフォルト値がその要素の値と見なされる。

注)要素のデフォルト値は要素の宣言からのみ使える設定

 

単純型と複合型の派生の方法:

 

単純型    ――       制限

              |―       ユニオン

              |―       リスト

 

複合型    ―  単純型内容を持つ複合型       ――       制限

                                                                   |―       拡張

             

              |― 複合型内容を持つ複合型       ――       制限

                                                                   |―       拡張

 

 

内容モデルとモデルグループ:

複合型の内容を持つ複合型の、内容がどんな要素やテキストで構成されているかを示す部分を内容モデルという。

内容モデルを構成する部品として要素の出現の仕方を指定するものをモデルグル−プsequence, choice, all)という。

 

xsd:anyType型を基準型にして制限:

xsd:anyTypeはどんな型でもマッチする汎用型。「複合型内容を持つ複合型」の制限の一例として、これを基準型として型の制限を行っていく。

 

複合型内容を持つ複合型の制限:

「複合型内容を持つ複合型」の制限の場合、「制約された結果どうなるか」を定義しなくてはならない。これは、「単純型」および「単純型内容を持つ複合型」の内容の制限が制約ファセットで元になるデータ型をどう制限するかという考え方とは抜本的に異なる。つまり、

     属性は、制限する際に何も書かなくていい(派生した先でその属性が継承される)が、

     内容モデルは、制限する際に何も書かないと、それは空の型として定義される(その内容は継承されない)。

ð         制限された結果どうなるかを書くぐらいだったら、基準型を書く意味がないのでは???

 

複合型内容を持つ複合型の省略記述方式:

xsd:anyTypeを基準型にして制限する場合にかぎり、以下の太字下線部分、

<xsd:complexType name="PrePoemType">

       <xsd:complexContent>

              <xsd:restriction base="xsd:anyType">

                     <xsd:sequence>

                            ...

                     </xsd:sequence>

                     <xsd:attribute name="pno" type="xsd:positiveInteger" use="required" />

              </xsd:restriction>

       </xsd:complexContent>

</xsd:complexType>

は省略して良いことになっている。

 

パーティクル:

xsd:sequence, xsd:choice, xsd:allの内容を構成する子要素になるものをパーティクルという。

 

混在内容:

要素の内容として、テキストと要素が混在している内容を混在内容という。

これは、複合型の属性mixed="true"とすることで実現する。

 

名前付きモデルグループ:

共通で用いる要素をグループ化しておくことができる。

例)

<xsd:group name="モデルグループの名前">
    sequencechoiceallのどれかのモデルグループ
</xsd:group>

 

<xsd:group ref="モデルグループの名前"/>

 

注)名前付きモデルグループ自体の出現頻度は、定義する際に設定してはいけない。これを設定してよいのは、名前付きグループの定義ではなくて参照する側である。

 

要素の追加:

複合型内容を持った複合型で要素を追加(extension)することもできる。

       <xsd:element name="poem" type="PoemType" />

      

       <xsd:complexType name="PoemType">

              <xsd:complexContent>

                     <xsd:extension base="PrePoemType">

                            <xsd:sequence>

                                   <xsd:element ref="yomi" />

                                   <xsd:element ref="season" />

                            </xsd:sequence>

                            <xsd:attribute ref="pno" use="required"/>

                     </xsd:extension>

              </xsd:complexContent>

       </xsd:complexType>

 

       <xsd:complexType name="PrePoemType">

              <xsd:sequence>

                     <xsd:element ref="poet" />

                     <xsd:element ref="kana" />

              </xsd:sequence>

       </xsd:complexType>

 

       <xsd:element name="poet" type="xsd:string" />

       <xsd:element name="kana" type="xsd:string" />

       <xsd:attribute name="pno" type="xsd:positiveInteger" />

       <xsd:element name="yomi" type="xsd:string" />

       <xsd:element name="season" type="xsd:string" />

 

複合型内容を持った複合型の制限:

@単純型の制限:

              内容に対して制約ファセットを適用

 

A単純型内容を持った複合型の制限:

              内容に対して制約ファセットを適用

              属性の出現制約を強化

              属性に使用されている単純型の値の範囲を狭める

 

B複合型内容を持った複合型の制限:

              属性の出現制約を強化

              属性に使用されている単純型の値の範囲を狭める

              要素の出現制約を強化

              要素に使用されている単純型の値の範囲を狭める

注)内容が単純型ではないので、内容に対して制約ファセットを適用することはできない。

 

abstract属性:

XML Schemaでも抽象型(Javaでいう抽象クラス)を宣言することができる。

<xsd:element name="poem" type="PoemType" abstract="true"/>

 

 

substitutionGroup属性:

XML Schemaでも基底型(Javaで言うスーパークラス)のあるべきところに派生型を配置(Javaで言うサブクラスの代入)することができる。

<xsd:element name="miscellaneousPoem" type="MiscellaneousPoemType" substitutionGroup="poem"/>