XMLメモ
・XML文書:構造化されたテキスト
・XSLT:XML文書から特定のノードを抽出し、加工するための言語
eXtensible Stylesheet Language Transformations
要するにスタイルシートだが、cssのようなきめ細かな指定をするものではない。
拡張子は ".xsl"
◎スナップショット的
・DOM:Document Object Model
XML文書から特定のノードを抽出し、加工するための言語
◎動的。DOMを活用する事で、HTMLには無い電子文書の恩恵を受けられる。
・DTD:Document Type Definition (文書型宣言)
・XML parser:XML文書を、アプリケーションソフトが利用しやすい形に変換するソフトウェア
・XMLの構文にあっているXMLを Well-Formed XML と呼び,
XML の構文と DTD に従っている XML を Valid XML と呼ぶ。
Valid XML でなければ XML parser を通らない。
・DTDはXMLで記述されていない過去の資産であり、
XMLにはなじまない。とって代わる技術はXML Schema
■要素名(タグ)に使える文字
・先頭文字に使える文字:アルファベット、全角かな、漢字、コロン(:)、アンダーバー(_)
・2文字目以降に使える文字:上記の文字、数字、ピリオド(.)、ハイフン(-)
・場所によらず使えない文字:半角カナ、全角数字、全角アルファベット
■XML宣言
<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?> (? の前の半角スペースは無くてもOK)
<? 〜 ?> :処理命令
xml version="1.0" :バージョン
encoding="Shift_JIS" :文字コード。DefalutはUnicode(UTF-8 UTF-16)で、省略してもよい。
standalone="yes" :外部DTDを読み込むかどうか。no は読み込まなければならない設定。
DTDはXMLにとって必須ではない。
XML本文内に記述された、内部DTDは必ず読み込まれる。省略してもよい。
■終了タグは省略できない
空要素は、 <img src="hoge.jpg"></img>
か、
<img src="hoge.jpg" />
と記述する。
■大文字小文字は区別される
■属性名はダブルクォーテーションで囲まねばならない
■属性名は例外なく「属性名="属性値"」の形式で記述されなければならない。
■要素主体の書き方と属性主体の書き方
・要素主体
<book>
<author>
Myouji Namae
</autor>
</book>
・属性主体
<book author="Myouji Namae" />
属性主体の方がコンパクト。
要素主体の書き方は以下のように拡張が容易。
<book>
<author>
<firstname>Myouji</firstname>
<lastname>Namae</lasutname>
</autor>
</book>
■コメント
<!--コメント-->
■スタイルシートへの関連付け
books.xml--------------------------------------------
<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<?xml-stylesheet type="text/xsl" href="./books.xsl" ?>
----------------------------------------------------
type="text/css"も指定できる。
type = "text/css" でも type="text/css" と書いてもこの辺は結果に影響ない。
cssへの関連付けはXSL中で、↓の要領で行う。
<xsl:template match="/">
<html>
<head>
<title>
<xsl:value-of select="books/@title" />
</title>
<link rel="stylesheet" type="text/css"
href="books.css" />
</head>
sample
music.xml
music.xsl
■XSLTスタイルシート(.xsl)自体もXMLなので一行目は<?xml ?>処理命令(宣言とも)で始める
<?xml version = "1.0" ?>
で、XSLTスタイルシート(.xsl)のルート要素は以下の開始/終了タグになるので、
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
</xsl:stylesheet>
↑の3行はXSLTのお約束事であり、固定のフォーマットとなる。バージョンの指定も必須。
<xsl:stylesheet〜>は必然的に<?xml ?>処理命令の直後に記述することになり、
これがxslのルート要素になる。
■XSLTスタイルシートで出力方法を宣言する
<xsl:output method="html" encoding="Shift_JIS" />
method属性 :上の例はhtmlでの出力
encoding属性 :XML文書が記述されている文字コードを指定する。
xslの文字コードの事ではない。
<xsl:output>要素は省略出来る。が、確認の為にあった方がよい。
<xsl:output method="出力形式(xml | html | text)。ディフォルトはhtml。
[version="バージョン"]
[encodint="文字コード"]
[indent="インデントを付けるかどうか(yes|no)"]
[media-type="MIMEタイプ(text/htmlなど)"] 'マイムタイプ:Multipurpose Internet Mail Extensions。Webサーバーが利用する拡張子のようなもので、タイプ/サブタイプの形式でファイルの内容を明示する。
■xslの子要素は<xsl:template>が必ず一つ存在し、XML文書のルート要素に適用される
テンプレートは省略する事が出来ない。
<xsl:template match="/">
〜
</xsl:template>
match属性 はテンプレートが適用される要素を指定する。
"/"はXML文書のルートを指す。
■XSLで固定的なテキストを表示する
<p><xsl:text>固定的なテキスト</xsl:text></p>
<xsl:text></xsl:text>は省略出来る。無くても別段問題ない。
■XSL <xsl:value-of>要素で select 属性を使い
ルート要素("/")を起点として要素の内容を取得し出力する
<xsl:value-of select="xPath式" />
↓<books>がルート要素の場合
xml--------------------------------------------
<books title="web関連書籍一覧">
<owner address="CQW15204@nifty.com">
Yoshihiro.Yamada</owner>
/xml-------------------------------------------
xsl---------------------------------------------
<div><xsl:value-of select="books/owner" /></div>
/xsl--------------------------------------------
html---------------------------------------------
<div>Yoshihiro.Yamada</div>
/html---------------------------------------------
■XSL <xsl:value-of>要素で select 属性を使い
ルート要素("/")を起点として要素の属性を取得し出力する
xml--------------------------------------------
<books title="web関連書籍一覧">
/xml-------------------------------------------
xsl---------------------------------------------
<title><xsl:value-of select="books/@title" /></title>
/xsl--------------------------------------------
html---------------------------------------------
<title>web関連書籍一覧</title>
/html---------------------------------------------
■xPathでの記号
/ 直下の要素 book/author
<book>要素直下の<author>要素
// 全ての子孫 books//name
<books>要素配下の全ての<name>要素
. 現在の要素 ./category
現在のノード直下にある<category>要素
* 全ての子要素 book/* <book>要素直下の全要素
@ 属性名の接頭辞 book/@isbn <book>要素のisbn属性
: 名前空間のセパレータ
■xPathでのノード表現
text() match属性の値として使うと、平のテキストにマッチする
comment() コメントのノードにマッチする
node() 全種類のノードにマッチする
processing-instruction() 処理命令のノードにマッチする
■xPath関数{ノードセット関数、文字列関数、ブーリアン関数、数値関数、XSLT関数}の区分がある
number() 引数を数値にキャストする
<xsl:choose>
<xsl:when test="price[number(.) &lt;=3000]">
<b>
>xsl:value-of select="price" />円
</b>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="price" />円
</xsl:otherwise.
</xsl:choose>
return: 2999 | >b>3001>/b>
name() カレント要素の要素名を返す
<xsl:if test="name()='chapter'>
<xsl:text>>>>>>>>>>>>>/xsl:text>
>xsl:value-of select="chapter" />
<xsl:text>>>>>>>>>>>>>/xsl:text>
</xsl:if>
format-number(要素名,書式) 数値を整形して表示する
xml:<price>1234</price>
<xsl:value-of select="format-number(price,'#,###')" />円
return:1,234円
sum() 合計を表示する
<xsl:value-of select="sum(books//price)" />円
count() 要素数をカウントする
<xsl:value-of select="count(books//price)" />円
sum()と組み合わせて平均を求める
<xsl:value-of select="sum(books//price) div count(books//price)" />円
■xPATH関数まとめ
【ノードセット関数】
document(ノード名[,ノード名,…]) ノードセットが返る
ノード値が示す外部のXML文書を返す
document(@url)/books//book
last() 現在のノードセットのノード数を返す
name([ノード名,…]) ノード名(名前空間のプレフィックスを含む)が返る
namespace-uri([ノード名,…]) ノードセットが属する名前空間のURIが返る
position() 何番目の子ノードかの数値が返る
【文字列関数】
concat(文字列[,文字列,…]) 文字列を連結
concat(title,subTitle) <title>要素と
<subTitle>要素を連結
contains(文字列1,文字列2) True/False 文字列1が文字列2を含めばTRUE
contains(keyword,'ASP') <keyword>要素に
文字列'ASP'が含まれればTRUE
normalize-space([文字列,…]) 文字列の前後からスペースを除去
normalise-space(author) <suthor>要素の
前後から空白を取り除く
start-with(str1,str2) TRUE/FALSE str1がstr2で始まっていればTRUE
start-with(title,'XML') <title>要素が文字列XML
で始まっていればTRUE
string([ノード名,…]) ノードを文字列に変換
string(price) <price>要素の中身を文字列に変換
string-length([文字列,…]) 文字列長の数値を返す
substring(文字列、開始位置、抽出する文字数)
substring(@isbn,5,20) isbn属性の5ケタ目から20文字分を
抽出
substring-after(文字列1,文字列2) 文字列1を文字列2で区切った時の後半部分
substring-after(url,'://') &tl;url>要素を「://」で
区切ったときの後半文字列
substring-before(文字列1,文字列2)前半部分
【ブーリアン関数】
boolean(ノード名) ノードをブール値に変換
false() FALSEが返る
lang(文字列) xml:lang属性が指定された文字列を含めばTRUE
not() TUREであればFALSE、FALSEであればTRUE
true() TRUE
【数値関数】
ceiling(数値) 指定した数値より小さくない最小の整数を返す
floor(数値) 指定した数値より大きくない最大の整数を返す
number(ノード名) 与えられたノードの値を数値に変換
number(price) <price>要素の値を数値に変換
round(数値) 四捨五入して返す
sum(数値) 合計を返す
【XSLT関数】
current() コンテキスト (現在の) ノードを返す
element-available(文字列) 指定された要素名が現在のXSLTプロセッサで使えればTRUE
element-available('xsl:template') <xsl:template>要素が
使えればTRUE
format-number(数値,文字列) 数値を指定された書式に変換
format-number(price,'#,###,00') 3桁区切りで小数点第二位まで表示
function-available(文字列) 指定された関数が仕様できるかどうか
function-available('format-number')
format-number関数が使えればTRUE
system-property(string) 指定された文字列(xsl:version,xsl:vendor,xsl:vendor-urlなど)
で表されるシステムプロパティ
system-property('msxml:version') MSXMLのバージョンを返す
■テンプレートからテンプレートを呼ぶ
XSL内に<xsl:apply-templates select="books" />と記述した箇所に
別の場所にあるtemplate
<xsl:template match="books">〜</xsl:template>の内容を表示させる。
わざわざ別の場所に記述しなくてはならない理由(判りやすくなるとか)
があれば使い道のある仕様。
テンプレートは入れ子に記述することは出来ない。
<xsl:template match="books">〜</xsl:template>が存在しなくても
エラーにはならない。xml文書に<books>要素があれば平文のテキストで
出力され、<books>要素が無ければ、なにも表示されない。
■繰り返し指定要素にアクセスする
<xsl:for-each select="book">
〜
</xsl:for-each>
XML文書の<book>要素のそれぞれを処理する。
▼並び換えxsl:sort
book要素を並び換える。記述順に第一キー第二キーとなる。
xsl:sortはxsl:for-eachの出力順を制御する要素なのでfor-each内に記述する。
data-type="text"で、文字としての並び換えに対応。
data-type="number"として、数値としての並び換えに対応。
文字列の並び換えに "number " を指定してもエラーにはならないが、
並び換えはされない。data-type="hoge"ではエラーになる。
書式:
<xsl:sort select="ソートする対象の要素、属性を示すxPath式"
[data-type="データ型(text | number) "]
[order="並び換えの種類(ascending | descending)] />
<xsl:for-each select="book">
<xsl:sort select="publish" data-type="text"
order="ascending" />
<xsl:sort select="pDate" data-type="text"
order="descending" />
<tr>
<td><xsl:value-of select="@isbn" /></td>
<td><xsl:value-of select="name" /></td>
<td><xsl:value-of select="author" /></td>
<td><xsl:value-of select="publish" /></td>
<td><xsl:value-of select="price" /></td>
<td><xsl:value-of select="pDate" /></td>
</tr>
</xsl:for-each>
▼連番を表示する
xsl:for-each要素の中に以下の記述をすると連番が表示される。
<xsl:number format="01" />
"001"と表記すると3ケタ表示された。"100"を指定しても"2"を指定しても1から連番される。
他に、(i,I,a)も指定できる。
<xsl:number>要素の書式
<xsl:number [level="ナンバリングのレベル"]
[count="カウントする対象の要素や属性を特定するためのxPath式"]
[from="XML文書上は兄弟関係にあるものの、ナンバリングに際しては
親子関係を持つノードについて、どこからカウントを始めるかを指定"]
[format="ナンバリングの出力形式"] />
level属性の設定値
single 兄弟関係にあるノード単位にナンバリングを行う(ディフォルト)
multiple single指定によって出力されるナンバーの頭に親ノード単位の
ナンバリングを付加したもの。
any count属性で指定された式にマッチした順にナンバリングを行う。
■リンクを生成する
xml-----------------------------------------
<url>http://www.hogehoge.ne.jp/fushufushu/</url>
<name>Click Me!</name>
/xml----------------------------------------
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="url" />
</xsl:attribute>
<xsl:value-of select="name" />
</xsl:element>
で、
<a href="http://www.hogehoge.ne.jp/fushufushu/">Click Me!</a>
というhtmlが生成される。
xsl:element要素は省略可能なので、以下の記述でも同じ動作になる。
<a>
<xsl:attribute name="href">
<xsl:value-of select="url" />
</xsl:attribute>
<xsl:value-of select="name" />
</a>
■条件分岐:xsl:choose
test属性に条件式を指定する。
<xsl:choose>
<xsl:when test="ファイルパターン(条件式)">
条件に合致した場合の振る舞い
</xsl:when>
<xsl:otherwise>
条件に合致しなかった場合の振る舞い
</xsl:otherwise>
</xsl:choose>
test="要素名" とすると、xml文書にその要素名があれば TRUE
を返し、なければ FALSE を返す。
■条件分岐:xsl:if
<xsl:if test="ファイルパターン(条件式)">
条件に合致した場合の振る舞い
</xsl:if>
▼条件式:ファイルパターンの構文
起点となる要素[number(.) &lt;= 3000]
↑(.)は起点となる要素そのもので、number関数で数値にキャストし、<=3000 と比較している。
■xPathで使える演算子
[ ] :ファイルパターン book[category="ASP"]
配下の<category>要素が"ASP"である<book>要素
<xsl:for-each select="book[contains(name,'ASP')]">
book要素配下のname要素に'ASP'の文字列を含むbook要素に対し繰り返しの処理をする
</xsl:for-each>
<xsl:value-of select="sum(books/book[contains(name,'ASP')]//price)" />円
books要素配下のbook要素に'ASP'の文字列を含む全ての子孫のprice要素の合計を表示する
( ) :グルーピング book[(author='Yamamoto' or author="'Mochiduki') and category='XML']
配下の<author>要素が'Yamamoto'または'Mochiduki'で、かつ
<category>要素がXMLであるbook要素
+ :加算 number(price)+number(send)
<price>と<send>要素の値を加算
- :減算 number(price)-number(send)
<price>から<send>要素の値を減算
div :除算 number(total) div number(number)
<total>要素を<number>要素の値で除算
* :積算 number(total) * number(number)
<total>要素を<number>要素の値で積算
mod :剰余 number(total) mod number(number)
<total>要素を<number>要素の値で除算した余り
and :論理積 book[url and logo]
配下に<url>要素と<logo>要素を含む<book>要素
or :論理和 book[url or logo]
配下に<url>要素または<logo>要素を含む<book>要素
not :否定 book[not(category='XML')]
配下の<category>要素が'XML'でない<book>要素
= :等しい book[@isbn='ISBN9-999']
isbn属性が'ISBN9-999'である<book>要素
!= :等しくない book[@isbn!='ISBN9-999']
isbn属性が'ISBN9-999'でない<book>要素
< :より小さい book[number(price)<3000]
配下の<price>要素が3000未満の<book>要素
<= :以下 book[number(price)<=3000]
配下の<price>要素が3000以下の<book>要素
> :より大きい book[number(price)>3000]
配下の<price>要素が3000より大きい<book>要素
>= :以上 book[number(price)>=3000]
配下の<price>要素が3000以上の<book>要素
| :結合 book/(chapter|section)
<book>要素配下の<chapter>要素と<section>要素
■画像を表示する
xml-------------------------------------------
<logo>xml.jpg</logo>
/xml------------------------------------------
<xsl:element name="img">
<xsl:attribute name="src">
<xsl:value-of select="logo" />
</xsl:attribute>
<xsl:attribute name="width">120</xsl:attribute>
<xsl:attribute name="height">150</xsl:attribute>
</xsl:element>
■NaN 表示を置き換える
XSLで指定した属性が見つからない、数値に変換できない値を数値に
しようとすると、 NaN と表示される。
XSLで、処理前の行に以下記述しておくと
<xsl:decimal-format NaN = "不明" />
と記述しておくと、NaNの表示を'不明'に置き換えて表示する。
他、以下の数値表現の置き換えができる。
<xsl:decimal-format [name="フォーマット名]
[decimal-separator="小数点(「.」など)"]
[grouping-separator="桁区切り文字(「,」など)"]
[minus-sign=マイナス文字(「-」など)"]
[NaN="数字でない場合の表記(「NaN」など)"]
[percent="パーセント文字(「%」など)"]
[digit="0の場合の表記(「0」など)"] />
■表示処理を中止させる xsl:message要素
xsl:if xslchooseと組み合わせて使う。
<xsl:message terminate="yes" | "no">
表示したいメッセージ
</xsl:message>
空要素で記述(終了タグを省略する記法)でも記述できる。
■変数の定義
XSL上で複数個所から参照される値は変数で宣言しておくと
メンテナンスが容易になる。
▼宣言書式
<xsl:variable name="変数名">置き換える値(数値・文字列)</xsl:variable>
▼参照例
<xsl:for-each select"=book[contains(category,$変数名)]">
宣言された変数は「$変数名」で参照できる。
book要素で配下のcategory要素に変数で定義された文字列が含まれれば
抽出される。
■属性をまとめて定義する xsl:attribute-set 要素 と xsl:use-attribute-sets属性
XSL上で同じ属性値のセットを複数個所で使用している場合、記述のパターンを
属性名セットにまとめる事ができ、メンテナンス性も向上する。
▼宣言書式:
<xsl:attribute-set name="属性セット名">
<xsl:attribute name="属性名1">属性値</xsl:attribute>
<xsl:attribute name="属性名2">属性値</xsl:attribute>
<xsl:attribute name="属性名3">属性値</xsl:attribute>
…
</xsl:attribute-set>
▼参照例:
<table xsl:use-attribute-sets="属性セット名">
複数の属性をまとめて指定する事が出来る。
</table>
■外部XSLTを参照する xsl:include 要素
<xsl:include href="hoge.xsl" />
と記述することで、外部XSLTを読み込める。
テンプレートを部品化する事で、使い回しが出来ることで
メンテナンス性が向上する。
■DOM
DOMを動作させるのは、Msxml2.DOMDocumentというオブジェクト(らしい)
このオブジェクトを操作する言語は何でもよいが、javascriptからインスタンスを生成するには、
var objDoc=new ActiveXObject("Msxml2.DOMDocument");
objDoc.async=false;//XML文書の非同期呼び出しを可能にするかどうかをfalseに設定
objDoc.load("books.xml");
window.alert(objDoc.xml);
こんな感じ。
OPERAでは動作しなかった。
つか、XML文書自体OPERAは解釈しない。
もっと汎用性のある言語かと思っていたのでがっかり。
例えば、XMLのリンク仕様(xLink)(というものがあるらしい)
を実装したブラウザは現実には開発されていない。(2010.1現在)。
DOMオブジェクトにはMsxml2とMsxml4があるらしく、環境によって
かき分ける必要があるらしい。
▼objDoc.async=false;
//XML文書の非同期呼び出しを可能にするかどうかを決めている。
false:非同期でない⇒つまり同期させる
true:非同期である
非同期呼び出しを有効に下場合、XML文書自体が読み込まれていない
内に次の動作にはいろうとした場合エラーが発生する事になる。
▼window.alert(objDoc.xml);
.xmlはDOMのプロパティ。xml文書がアラートされる。
xsl文書の呼び出しにもxmlプロパティを使用する。
xsl文書もxml文書の規則で書かれたxml文書である。
▼window.alert(objDoc.text);
配下のテキストがアラートされる。
■ルート要素から直下の全ての子要素にアクセスする(for文)
var objDoc=new ActiveXObject("Msxml2.DOMDocument");
objDoc.async=false;
objDoc.load("books.xml");
var objRoot=objDoc.documentElement;
var clnCld=objRoot.childNodes;
for(i=0;i<clnCld.length;i++){
var objNod=clnCld.item(i);
window.alert(objNod.xml);
}
▼documentElementプロパティ
DOMツリーの最上位要素(ルート要素)を取得するXMLDOMNodeオブジェクトを返す。
▼childNodesプロパティ
XMLDOMNodeListオブジェクトを返す。XMLCOMNodeオブジェクトの
集合体。直下の子要素ノードを表す。
■ルート要素から直下の全ての子要素にアクセスする(最初の子要素から順)
var objDoc=new ActiveXObject("Msxml2.DOMDocument");
objDoc.async=false;
objDoc.load("books.xml");
var objRoot=objDoc.documentElement;
var objCld=objRoot.firstChild;
while(objCld!=null){
window.alert(objCld.xml);
var objCld=objCld.nextSibling;
}
▼firstChildプロパティ
現在のノードの最初の子要素を返す。要素が無ければnull(NULLではない)を返す。
▼nextSiblingプロパティ
兄弟関係にある要素から次の子要素を返す。要素が無ければnullを返す。
■ルート要素から直下の全ての子要素にアクセスする(最後の子要素から順)
var objDoc=new ActiveXObject("Msxml2.DOMDocument");
objDoc.async=false;
objDoc.load("books.xml");
var objRoot=objDoc.documentElement;
var objCld=objRoot.lastChild;
while(objCld!=null){
window.alert(objCld.xml);
var objCld=objCld.previousSibling;
}
▼lastChildプロパティ
現在のノードの最後の子要素を返す。要素が無ければnull(NULLではない)を返す。
▼previousSiblingプロパティ
兄弟関係にある要素からひとつ前の子要素を返す。要素が無ければnullを返す。
■子要素から親ノードを取得する
var objDoc=new ActiveXObject("Msxml2.DOMDocument");
objDoc.async=false;
objDoc.load("books.xml");
var objRoot=objDoc.documentElement;
var clnCld=objRoot.childNodes;
for(i=0;i<clnCld.length;i++){
var objNod=clnCld.item(i);
window.alert(objNod.parentNode.xml);
}
//親ノードのXML文書が子要素の個数分アラートされる。
▼parentNodeプロパティ
親要素を返す。
■XML文書から属性値を取り出す
var objDoc=new ActiveXObject("Msxml2.DOMDocument");
objDoc.async=false;
objDoc.load("books.xml");
var objRoot=objDoc.documentElement;
var clnCld=objRoot.childNodes;
for(i=0;i<clnCld.length;i++){
var objNod=clnCld.item(i);
var clnAtr=objNod.attributes;
var objAtr=clnAtr.item(0)
window.alert(objAtr.text);
}
▼attributesプロパティ
全属性群を含むXMLDOMNameNodeMapオブジェクトを返す。
XMLDOMNamedNodeMapオブジェクトはぞk末井ノードを示すXMLDOMNode
オブジェクトの集合体。
●getNamedItem
XMLDOMNamedNodeMapオブジェクトに対して、インデックスではなく
属性名でアクセスする手段。
for(i=1;i<clnCld.length;i++){
var objNod=clnCld.item(i);
var clnAtr=objNod.attributes;
var objAtr=clnAtr.getNamedItem("isbn")
window.alert(objAtr.text);
}
●getQualifiedItemメソッド
XMLDOMNameNodeMapオブジェクトに対して、インデックスではなく
属性名でアクセスする手段(その2)
第2引数は、xsl:use-attribute-sets="属性セット名" を使用した場合の
名前空間(属性セット名)の指定し使う。
for(i=1;i<clnCld.length;i++){
var objNod=clnCld.item(i);
var clnAtr=objNod.attributes;
var objAtr=clnAtr.getQualifiedItem("isbn","");
window.alert(objAtr.text);
}
●getAttributeNode
getAttributeNodeメソッドは、親要素を表すXMLDOMNodeオブジェクト
に対して、属性名をキーにアクセスします。属性ノードを返します。
XMLDOMNameMapオブジェクトを介さないので、より簡潔な記述で済む。
for(i=1;i<clnCld.length;i++){
var objNod=clnCld.item(i);
var objAtr=objNod.getAttributeNode("isbn");
window.alert(objAtr.text);
}
●getAttributeメソッド
getAttributeはXMLDOMNodeオブジェクトに属性名でダイレクトにアクセスする。
for(i=1;i<clnCld.length;i++){
var objNod=clnCld.item(i);
window.alert(objNod.getAttribute("isbn"));
}
■ダイレクトに要素を抽出する
selectNodesメソッドでXML文書の要素にアクセスする
書式:-----------------------------------------------------------------
XMLDOMNodelistオブジェクト型の変数
=( XMLDOMNodeオブジェクト|XMLDOMDocument2オブジェクト)
.selectNodes("xPath式");
----------------------------------------------------------------------
var objDoc=new ActiveXObject("Msxml2.DOMDocument");
objDoc.async=false;
objDoc.load("books.xsl");
var clnSrt=objDoc.selectNodes("xsl:stylesheet//xsl:sort");
/*
var clnSrt=objDoc.selectNodes("xsl:stylesheet//xsl:sort/@select");
↑こう書けば属性に対してダイレクトにアクセスできる。
属性もノードとして扱われる事は見落としがち。
*/
/*
selectNodes の他、
var clnSrt=objDoc.getElementByTagName("xsl:sort");
でも、XMLDOMNodeListオブジェクトが返る。
どちらにしろ、兎に角XML文書内にある特定の要素を全て抽出する。
xPath式の「//」演算子も、負荷の大きい処理だが、
getElementByTagNameメソッドの負荷は更に大きい。
*/
/*
xsl文書
<xsl:for-each select="book[contains(name,'ASP')]">
<xsl:sort select="pDate" data-type="text" order="descending" />
〜〜〜〜
</xsl:for-each>
*/
//抽出した要素のプロパティを出力する
with(document){
write("prefix = " + clnSrt.item(0).prefix + "<br>");
// xsl:
write("namespaceURI = " + clnSrt.item(0).namespaceURI + "<br>");
// http://www.w3.org/1999/XSL/Transform
write("baseName = "+ clnSrt.item(0).baseName + "<br>");
// sort
write("nodeName = " + clnSrt.item(0).nodeName + "<br>");
// xsl:sort
write("nodeType = " + clnSrt.item(0).nodeType + "<br>");
// 1 'ノードのタイプを数値で返す。
write("nodeTypeString = " + clnSrt.item(0).nodeTypeString + "<br>");
// elsement 'ノードのタイプを文字列で返す。
write("dataType = " + clnSrt.item(0).dataType + "<br>");
// null 'XMLSchemaにおいてノードのデータ型
write("hasChildNodes() = " + clnSrt.item(0).hasChildNodes() + "<br>");
// false
}
■selectSingleNodeメソッド
引数のxPath式に合致するノードを1つだけ抽出するためのメソッド。
単位値のノードを示すXMLDOMNodeオブジェクトを返す。
var objDoc=new ActiveXObject("Msxml2.DOMDocument");
objDoc.async=false;
objDoc.load("books.xsl");
/*
xsl文書
<xsl:for-each select="book[contains(name,'ASP')]">
<xsl:sort select="pDate" data-type="text" order="descending" />
〜〜〜〜
</xsl:for-each>
*/
var clnSrt=objDoc.selectSingleNode("xsl:stylesheet//xsl:sort");
if(clnSrt!=null){
window.alert("ノードが見つかりました");
}
■XML文書にノードを追加する
'books_test.xml-----------------------------------
//UTF-8で作成する事
'-----------------------------------------------
//スクリプトはhtmlファイルを独立して作成し
その中にに記述する。
//xsl内にあるhtml部分に記述しても
//そのxslを参照するxml文書には反映されなかった。
//(alertとかdocument.writeとかは有効なのだが・・・
//納得いかない) ⇒そもそも編集したXML文書をアラートしても
//意味が無い。save(ファイル名)メソッドで独立したファイルとして
//保存できなければ意味が無いが、この動作はサーバーサイド
//プログラムとしてしか使う事ができない。
var objDoc=new ActiveXObject("Msxml2.DOMDocument");
objDoc.async=false;
objDoc.load("books_test.xml")//要素を追加するxml文書をロードする
//xml文書のルートを取得する
var objRoot=objDoc.documentElement;
//book要素の作成
var objBook=objDoc.createElement("book");
//isbn属性の作成
var objISBN=objDoc.createAttribute("isbn");
objISBN.text="ISBN9-99999-999-9";
/*↑2行の別記法:
objBook.setAttribute("isbn","ISBN9-99999-999-9");
*/
//hoge1,hog2…複数の要素を作成
var objHoge1=objDoc.createElement("hoge1");
var objHoge2=objDoc.createElement("hoge2");
//…
//book要素に…
with(objBook){
//isbn属性を追加
setAttributeNode(objISBN);
/*↑の別記法
var clnAtr=objBook.attributes;
clnAtr.setNamedItem(objISBN);
*/
//子要素を追加
appendChild(objHoge1);
appendChild(objHoge2);
//…
}
//ルート要素の子要素にbook要素を追加
objRoot.appendChild(objBook);
/*objRoot.insertBefore(objRoot.firstChild);
ルートの冒頭に挿入する
*/
/*objRoot.insertBefore(objBook,objRoot.childNodes(1));
ルートの2番目の要素として挿入する
2番目が見つからないと null が返され最後の要素として
挿入される
*/
/*objRoot.insertBefore(objBook,null);
最後の要素として挿入される
*/
window.alert(objDoc.xml);
create〜系のメソッド
メソッド名 |
|
|
createCDATASection |
生成するノード |
CDATAセクションノード |
構文 |
var objDCAT=objDoc.createCDATASection(strDat) |
引数 |
objDCAT:XMLDOMCDATASectionオブジェクト
strDat:文字データ
|
createComment |
生成するノード |
コメントノード |
構文 |
var objDoc.createComment(strDat) |
引数 |
objCOM:XMLDOMCommentオブジェクト
strDat:文字データ
|
createDocumentFragment |
生成するノード |
ドキュメントの断片 |
構文 |
var objFrg=objDoc.createDocumentFragment() |
引数 |
objFrg:XMLDOMDocumentFragmentオブジェクト
|
createEntityReference |
生成するノード |
実体参照ノード |
構文 |
var objER=objDoc.createEntityReference(strER) |
引数 |
objER:XMLDOMEntityReferenceオブジェクト
strER:実体参照名
|
createProcessingInstruction |
生成するノード |
処理命令ノード |
構文 |
var objPL=objDoc.createProcessingInstruction(strTrgt.strDat) |
引数 |
objPL:XMLDOMProcessingInstructionオブジェクト
strTrgt:ターゲット名、strDat:アプリケーションに渡すデータ
|
createTextNode |
生成するノード |
テキストノード |
構文 |
var objTxt=objDoc.createTextNode(strDat) |
引数 |
objTxt:XMLDOMTextNodeオブジェクト
strDat:テキストデータ
|
■属性を削除する。要素を削除する。要素を置き換える。
var objDoc=new ActiveXObject("Msxml2.DOMDocument");
objDoc.async=false;
objDoc.load("books.xml");
var objRoot=objDoc.documentElement;
//title属性の削除
objRoot.removeAttribute("title");
/*属性削除の別記法
▼
var clnAtr=objRoot.attributes;
clnAtr.removeQualifiedItem("tiltle","");
属性群(XMLDOMNamedNodeMapオブジェクト)から特定の属性を削除。
第一引数の要素名、第2引数に名前空間プレフィックス。
名前空間を伴った属性の操作に使用する。
▼また、
var clnAtr=objRoot.attributes;
clnAtr.removeNamedItem("title");
とも記述できる。
属性群(XMLDOMNamedNodeMapオブジェクト)から特定の属性を削除。
▼さらに、
var objTtle=objRoot.getAttributeNode("title");
objRoot.removeAttributeNode(objTtle);
XMLDOMNodeオブジェクトに属するメソッド。
引数:属性ノード
*/
var clnChld=objRoot.childNodes;
// 冒頭の要素の削除
objRoot.removeChild(clnChld.item(0));
var objBook=objDoc.createElement("book");
//最後の要素と入れ替え
objRoot.replaceChild(objBook,objRoot.lastChild);
/*
3つの変数は全て、XMLDOMNodeオブジェクト
*/
window.alert(objDoc.xml);
//objDoc.save("output.xml");
/*
↑saveメソッドはクライアントの環境では動作しない。
サーバーサイドプログラムとして有効(らしい)。
編集したXML文書を単独のファイルとして保存する。
*/
■DTD宣言:Document Type Definition:文書型宣言
DOMと連携することで、XML文書を動的に検証し、不正な記述に対してアラームを発する。
DTDは・内部サブセット・外部サブセットがある。
XML文書の骨格
XML宣言
(<xml?>)
|
DTD(文書型定義)
※外部DTDの引用も出来る
要素型宣言、属性リスト宣言、実体宣言、記法宣言
|
XML文書本体
(インスタンス)
|
|
■内部サブセットのフォーマット
<!DOCTYPE ルート要素名[ 〜]>
DTDを伴うXML文書はXML本文上もDTD規則に即している必要があり
Well-Formed(整形式)なXML文書と呼ぶ。
DTDを伴わないXML構文規則にのみ従うXML文書をValid(妥当)なXML文書と言う。
■要素型を宣言する
<!ELEMENT books (owner,book*)>
↑ルート要素 books の配下に
owner book の記述順に(,)
owner 要素が一つ、book 要素が0回以上(*)登場する。
記号
記号 | 説明 |
なし | 必ず1回登場 |
? | 0回か1回 |
* | 0回以上(つまり、何回でもかまわない) |
+ | 1回以上 |
, | 記述順に要素が登場する |
| | 並列に記述された要素がいずれか1つ登場する |
■要素に含まれるデータを定義する
<ELEMENT owner (#PCDATA)>
↑owner 要素が、配下に文字データ (#PCDATA) のみ持つ。
"owner" と "("の間にはスペースがないとエラーになる。
データを表すキーワード
キーワード | 説明 |
#PCDATA | 文字データのみが含まれる |
ANY | ありとあらゆる要素、文字データが含まれる |
EMPTY | 要素配下には何も含まれない |
<!ELEMENT memo (#PCDATA | keyword | ref)*>
memo 要素に・文字データ ・kyeword 要素 ・ref要素 が、
順不同(|)で、0回以上(任意の回数*)
この場合の文字データ(#PCDATA)は、memoタグに囲まれた文字列で、
keyword タグにも refタグ にも囲まれていない部分を指す。
文字データと要素を並列に記述する場合は、必ず#PCDATAを
先頭に記述しなくてはならない。
<!Element 要素1(要素a,要素b,要素c,要素d,要素e,要素f,要素g,要素h?)>
↑要素1の配下にa〜hの順で各1回要素が登場し、hは登場しなくてもよい。
■属性リストを宣言する
<ATTLIST books tiltle CDATA #IMPLIED>
↑books 要素に文字データ(CDATA)の title 属性が任意で(#IMPLIED)登場する。
▼属性を並列に記述してもよい
<ATTLIST book isbn CDATA #REQUIRED cdrom CDATA #IMPLIED>
属性リスト宣言で使用できるデータ型一覧
データ型 | 説明 | 例 |
CDATA | 文字列 | <ATTLIST book name CDATA> |
enumeration(列挙) | 候補値の一覧(|区切りで空白文字を含めない。後に続く"文字列は"ディフォルト値でたぶん無くてもよい。IEで値にカタカナを使用するとエラー扱いされるのはおそらくIEのバグ。ひらがな・カタカナ共に使う事が出来ない場合、漢字かローマ字で代替するしかなさそう。) | <ATTLIST book category(ASP | XML | JSP) "XML"> |
ENTITY | 実体参照 | <ATTLIST memo ref ENTITY #IMPLIED> |
ENTITIES | ENTITYを空白区切りで並べたもの | <ATTLIST memo ref ENTITIES #IMPLIED> |
ID | 一意の識別子 | <ATTLIST book isbn ID #REQUIRED> |
IDREF | IDを参照 | <ATTLIST related ref IDREF #REQUIRED> |
IDREFS | IDREFを空白区切りで複数並べたもの | <ATTLIST related ref IDREFS #REQUIRED> |
NMTOKEN | 名前トークン | <ATTLIST book name NMTOKEN #REQUIRED> |
NMTOKENS | NMTOKENを空白区切りで複数並べたもの | <ATTLIST book author NMTOKENS #REQUIRED> |
データ型を'ID'にした場合には、特殊キーワードが必須となる。
キーワード | 説明 | 例 |
#REQUIRED | 必須 | <ATTLIST book isbn ID #REQUIRED> |
#IMPLIED | 任意 | <ATTLIST memo ref ENTITIES #IMPLIED> |
#FIXED | 固定値 | <ATTLIST book cdrom CDATA #FIXED "ture"> |
■外部DTD(外部サブセット)
▼外部DTDには、
<!Doctype ルート要素名[
〜
]>
の、「〜」の部分のみを記述する。
▼外部DTDを参照
<?xml version="1.0" ?>
<!DOCTYPE books SYSTEM "books.dtd">
▼外部DTDと内部DTDを一緒に記述する記法
<!DOCTYPE books SYSTEM "books.dtd"[
〜ここにDTDを書く〜
]>
■DTD内に記述する実体参照
▼長い文字列を実体参照させる
<!ENTITY asp "Active Sever Pages">
こう書いておけば、"&asp;" と記述した部分が "Active Sever Pages" に置き換えられる。
▼xmlファイルを実体参照させる
<!ENTITY book1 SYSTEM "book1.xml">
↑DTDにこう書いておけば、
<? xml version="1.0" ?>
<ルート要素名>
&book1;
<!-- ここにbook1.xmlのxml文書が挿入される -->
&book2;
&book3;
&book4;
…
<!--
この手法を用いればxml文書を部品化してコンパクトにまとめられ
保守性が向上する。
-->
</ルート要素名>
▼特殊文字を実体参照させる
xml文書に限らず、htmlでも半角文字で &lt; をブラウザ上に表示できないが、
[]+[文字コード;]で表記可能となる。
十進でa:97 、16進でa:x61 の要領。
&[]+[108;]+[]+[116;;] で、
< となる。
■XML Schema
XML SchemaはXML文書であり、DTDに変わり得る文書型記述の方法。
拡張子はXSD。
DTDより細やかにデータ型を制約できる。
XSD文書とXML文書の関連付けは謎だが、XML文書のルート要素に、
<ルート要素名 xmlns="urn:"拡張子を付けないXSD文書名?(謎)>
属性を追加記述する。
例えば、XML SchemaでXML文書の構文チェック
の実例を見ても上記の記述部分は何の役割はなく、上記の追加記述がなくとも動作する。
XMLsample
XSDsample
■XSD宣言
<xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
〜〜〜
文書定義の記述
〜〜〜
</xsd:schema>
■配下にテキストしかもたない要素の定義
<xsd:element name="要素名" type="データ型" />
例:<xsd:element name="price" type="xsd:positiveInteger">
xsd:positiveInteger は、0を含まない正の整数。
XML Schemaで使えるデータ型
データ型 | 説明 |
string | 文字列 |
binary | バイナリデータ |
boolean | 真偽(true,false) |
byte | バイト型(-127〜128) |
century | 世紀(例:20) |
date | 日付型(例:2001-09-10) |
decimal | 10進数 |
double | 64ビット倍精度浮動小数点 |
ENTITY | 実体型 |
float | 32ビット単精度浮動小数点 |
ID | ID型 |
IDREF | ID参照型 |
IDREFS | ID参照型の集合体 |
integer | 整数型(-2147483648〜2147483647 |
long | 長整数型(-9223372036854775808〜9223372036854775807 |
month | 月(例:2001-09) |
NAME | 名前(XML1.0) |
NCNAME | コロンなしの名前 |
negativeInteger | 負の整数(0を含まない) |
NMTOKEN | NMTOKEN型 |
NMTOKENS | NMTOKEN型の集合体 |
nonNegativeInteger | 0以上の整数(0を含む) |
nonPositiveInteger | 0以下の整数(0を含む) |
NOTATION | 記法型 |
positiveInteger | 正の整数(0を含まない) |
QNAME | 名前(XML Namespaces) |
short | 短整数型(-32768〜32767 |
time | 時刻型(例:20:15:12.000) |
timeDuration | 期間(例:P2Y10M15DT15H30M10.97[2年10カ月15日と15時間30分10.97秒]) |
unsignedByte | 符号なしバイト型(0〜255) |
unsignedInt | 符号なし整数型(0〜4294967295) |
unsignedLong | 符号なし長整数型(0〜18446744073709551615) |
unsignedShort | 符号なし短整数型(0〜65535) |
uriReferenceanyURIを使うべきなのか?uriReferenceを使用するとDOMがXML Schemaを解釈しない?謎。 | URI(Uniform Resource Identifier:ネットワーク上の位置情報)(例:http://www.w3.org/2001/XMLSchema) |
year | 年(例:2001) |
「XML Schemaで使えるデータ型」表で、uriReferenceがエラーになって俄かに信じがたいので
以下ヘルプから引用しておく
■配下に子要素を持つ要素と、子要素も属性も持たない要素
▼子要素も属性も持たない要素の定義(つまり、テキストデータのみの要素)
xml----------------------
<price>2800</price>
-------------------------
<xsd:element name="price" type="xsd:positiveInteger">
だが、これは、
<xsd:element name="price">
<xsd:simpleType>
<xsd:restriction base="xsd:positiveInteger" />
</xsd:simpleType>
</xsd:element>
という厳密な記法が用意されている。
restriction とは、「制約」の事。
restriction 要素の base属性でデータ型を指定する時、element要素の type属性による
データ型指定は出来ない。
restriction はsimpleType とセットで記述する(たぶん)
▼子要素あるいは属性を持つ要素の定義
<xsd:element name="books">
<xsd:complexType>
<!-- 各子要素は記述した順番で出現する書き方。
子要素が1つしかない場合も sequence を指定して良い。
順不同の場合には、<xsd:all>〜</xsd:all>。
この指定は省略できない-->
<xsd:sequence>
<xsd:element name="owner" type="ownerType"
minOccurs="1" maxOccurs="1" />
…
<xsd:element name="book" type="bookType"
minOccurs="0" maxOccurs="unbounded" />
…
…
<xsd:attribute name="title" type="xsd:string" use="optional" />
<!-- use属性には optional(任意)の他、
required(必須) default(既定値指定) fixed(固定値指定) がある-->
</xsd:sequence>
</xsd:complexType>
</xsd:element>
▼要素の登場回数を制限する
<xsd:element name="owner" type="ownerType"
minOccurs="1" maxOccurs="1" />
↑最低1回、最大1回、なので、owner要素は必ず1回記述するという意味になる。
minOccurs maxOccurs が共に省略された場合、ディフォルトで
その要素は「必ず1回登場」するという指定になる
minOccurs maxOccursの組み合わせによる意味
minOccurs | maxOccurs | 登場回数 |
省略 | 省略 | 必ず1回登場 |
1 | 1 | 必ず1回登場 |
0 | 1 | 0回か1回登場 |
0 | unbounded | 0回以上登場 |
1 | unbounded | 1回以上登場 |
▼要素にテキストデータと子要素、或いは属性が含まれる事を明示する mixed 属性
<xsd:element name="owner">
<xsd:complexType mixed="true">
<xsd:attribute name="address" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element name="owner">
owner 要素はmixed="true" なので、
<owner address="XXXX@nifty.com">
MYOUJI NAMAE
<owner>
と、テキストデータを含める事ができる。
mixed="false" であればテキストデータを記述する事はできない。
省略した場合は(たぶん)false になる(ように感じる)。
▼孫要素(属性を持つ子要素を含む)があっても階層構造で記述しない記法
owner 属性には address 属性があり、book 要素は複数の子要素が含まれるが、
books 要素の定義部分には books 要素の中身にたいする記述だけで済ませる。
address 属性やbook要素の子要素の記述は別の場所に記述する。
この記法を可能にしているのが、
<xsd:element name="owner" type="ownerType" />
↑の type 属性。↓のname 属性で関連付けをして、element 要素で囲まないで記述する。
onerType の宣言をしている部分。
<xsd:complexType name="ownerType" mixed="true">
<xsd:attribute name="address" type="xsd:string" use="required" />
</xsd:complexType>
■要素のデータ型の制約を細やかに定義する記法
books.xml
books.xsd
bookSub.xsd
▼要素名の揺らぎを吸収する xsd:choice 要素
要素名の規則に従っていない(文化が異なるとか等の理由で)規則を
定義する書き方。xsd:choice 要素で挟んである要素の何れかが使われる。
<xsd:choice>
<xsd:element name="要素1" />
…
<xsd:element name="要素N" />
</xsd:choice>
▼共通の属性を一つにまとめる記法 xsd:attributeGroup name="属性グループ名" 要素
複数の要素に共通の属性がある場合、(例えば、htmlにおける border や align 等の属性は、
img table frame 等複数の要素で共通して使用される。)それぞれの定義を各々の要素の
中で定義していくのは効率が悪く、定義に変更が発生した場合の保守性も悪くなる為、
attributeGroup 要素が用意されている。
データ型が時刻型でなければならない hoge_time 属性を複数の要素で共有する場合、
<xsd:attributeGroup name="hoge_timeAttr">
<xsd:attribute name="hoge_time" use="required">
<!--simpleType は属性の定義に対しても使用される -->
<xsd:sinpleType>
<xsd:restriction base="xsd:time />
</xsd:sinpleType>
</xsd:attribute>
</xsd:attributeGroup>
と記述し(時刻型であることと、属性の記述が必須である事を制約)
、この属性を受け取る側の要素の定義には、
<xsd:complexType name="要素Type">
<xsd:element name="=〜…
<xsd:element name="=〜…
…
<xsd:attributeGroup ref="hoge_timeAttr" />
</xsd:complexType>
と name属性と ref属性とを対応させて関連付けする事ができる。
▼要素または属性の値を幾つかの候補に限定する xsd:enumeration 要素
<xsd:element name="category">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="ASP" />
<xsd:enumeration value="XML" />
<xsd:enumeration value="JSP・Servlet" />
</xsd:restriction>
</xsd:simpleType>
<xsd:element>
▼文字列のパターンチェック:正規表現を定義する xsd:pattern要素
書式:
<xsd:pattern value="正規表現" />
例1:) [0-9]{1} ⇒ 0 〜 9 の文字で1桁、の指定。
例2:)[\w\.-]+(\+[\w-]*)?@([\w-]+\.)+[\w-]+
「[ ]」は、囲まれた中の何れかの文字の意味。
「+」は直前の文字が最低一回は繰り返されるという意味。
「\w」 は[a-zA-Z0-9_](アルファベット、数字、下線)の略記法。
「.」はとにかく何でもいい一文字だが、「\」が付いているので「.」そのものを表す
「?」は直前の文字が全くないか、1つだけあるという意味。直前の文字が「( )」でグループ化されている。
「*」は直前の文字が全くないか、1つ以上連続するという意味。ワイルドカードの「*」とは異なる。
「\+」の部分は「+」そのものを表す(筈)。
ここには無いけど「^」は否定。^a で、a以外の文字を表す。
他は正規表現の解説書を勉強する。。。
秀丸エディタの正規表現では、
. は改行以外の一文字をあらわす
<a href="">text</a> からリンクを解除したければ、
<(a|A) [^>]+> と </(a|A)> を空白文字列で置き換えればよい(たぶん)。
▼XML Schemaで定義できるその他の制約条件
XML Schemaで定義できるその他の制約条件
要素 | 説明 | 指定値 |
<xsd:encoding> | エンコード型を制限 (hex,base64) | バイナリ型にのみ有効 |
<xsd:length> | 文字列長、リストの個数を制限 (hex,base64) | 負でない整数 |
<xsd:maxExclusive> | データが指定された値未満である事 | 対象となるデータ型と等しいデータ型 |
<xsd:maxInclusive> | データが指定された値以下である事 | 対象となるデータ型と等しいデータ型 |
<xsd:maxLength> | 文字列長、リストの個数の最大値 | 負でない整数 |
<xsd:minInclusive> | データが指定された値以上であること | 対象となるデータ型と等しいデータ型 |
<xsd:minExclusive> | データが指定された値より大きい事 | 対象となるデータ型と等しいデータ型 |
<xsd:minlength> | 文字列長、リストの個数などの最小値 | 対象となるデータ型と等しいデータ型 |
<xsd:precision> | 最大桁数 | 正の整数 |
<xsd:scale> | 有効小数点数 | 負でない整数 |
▼値がリストである要素を定義する xsd:list itemType-"値のデータ型" 要素
XML Schema では、半角スペース区切りの値リストを持つ要素である事を定義できる。
xml-------------------------------
<author>著者1 著者2<author>
----------------------------------
何のデータ型のリストを定義するのか、別の場所に定義を作っておき、
<xsd:simpleType name="authorType">
<list itmeType="xsd:string" />
</xsd:simpleType>
restriction属性で定義を指定する。
<xsd:element name="author">
<xsd:simpleType>
<xsd:restriction base="authorType">
<xsd:maxLength value="3" />
</xsd:restriction>
</xsd:simpleType>
<xsd:element>
▼XML Schema を分割する xmd:include schemaLocation="xsdファイルパス"
<xsd:include schemaLocation="bookSub.xsd" />
と書いて、他のxsdファイルを参照することができる。
ルート要素定義の手前に(xsd:schema 宣言の直後に記述しないとエラーになる?)
XML文書の構文をMSXML2.DOMDocument.4.0でチェックするスクリプト
xmlcheck.html---------------------------------------------------------------------------------
<html>
<head>
<title>XML文書の構文をMSXML2.DOMDocument.4.0でチェックする</title>
<meta http-equiv="Content-Script-Type" content="text/javascript">
<script type="text/jscript">
<!--
var strX;
function xmlchk() {
strX = document.fm1.ta1.value;
//alert(strX);
var objDoc = new ActiveXObject("MSXML2.DOMDocument.4.0");
objDoc.async = false
objDoc.loadXML(strX);
var objErr = objDoc.parseError;
if (objErr.errorCode != 0) {
var str = objErr.errorCode + "\n";
str += objErr.line + "行 " + objErr.srcText + "\n";
str += objErr.reason;
window.alert(str);
} else {
window.alert("XML文書はスキーマに従っています");
}
}
//-->
</script>
</head>
<body>
<h1>XML文書の構文をMSXML2.DOMDocument.4.0でチェックする</h1>
<form name="fm1" action="">
<input type="button" value="Check" onclick="xmlchk()" >
<input type="reset" value="Reset">
<br>
<textarea name="ta1" cols="80" rows="30">XML文書を貼り付けて[Check]します</textarea>
</form>
</body>
</html>
/xmlcheck.html--------------------------------------------------------------------------------
XSLにスクリプトを記述する
■CDATAセクション
<?xml version="1.0"?>
<sample>
sampleです
<![CDATA[
CDATAセクション
CDATA Section
sampleです
]]>
<!--
コメントです
CDATAセクションに書かれた文字をXMLパーサは無視する。
タグを書いても、タグとして解釈されない。
コメントとの使い分けがピンと来ないが、CDATAセクションに
にしないで、<>を&lt;&gt;と記述することと同じに機能する
DOMプログラムをXSLの中に記述する場合htmlタグをそのまま
記述できるようになるので便利(らしい)。
XSLの中にスクリプトを記述する場合は、CDATAセクション内に記述しないと
IEで開いたときにスクリプト部分の改行が無視されて表示され読みづらくなるので
原則として<![CDATA[ 〜 ]]>内にスクリプトを記述する。
囲まれた範囲のタグはタグとして解釈されなくなるので<script>と</script>
部分はCDATAセクションに入れないように囲まないと、、スクリプトの文字列がそのまま
ブラウザに表示されてしまうという間抜けなことになる。
-->
</sample>
■すでに読み込まれているXMLファイルを参照する場合
MSXML2.DOMDocument.4.0 オブジェクトをインスタンス化必要は無い。
var objDoc=document.XMLDocument;
var objStl=document.XSLDocument;
とすれば、XML、XSL文書を取得できる。
■動的のソースを入れ替える
HTML上のid.innerHTML=xmlドキュメントオブジェクト.documentElement.transformNode(xslドキュメントオブジェクト);
↑、HTMLid部分に 変更したxslの部分をxmlのルートノードに対して差し替えている?
難解なコードだ。
xml_sample
xsl_sample
css_sample
▼XMLDocumentのメンバとメソッド
●documentElement
ドキュメントのルート XmlElement を取得します。
alert(objDoc.documentElement.nodeName); //例えば books というノード名が返る。
●transformNodeメソッド
strValue = oXMLDOMNode.transformNode(objStylesheet);
パラメタ
objstylesheet
オブジェクト。 このノードの変換を指示するXSLT要素から成る有効なXMLドキュメントかDOMノード。
リターン値
文字列。 XSLTスタイルシートに基づくこのXMLドキュメントの変換の製品を含むストリングを返します。