XMLマスター(Pro V1)受験時にまとめたノウハウ集。
XSLT
- トップレベル要素 xsl:import ※トップレベル要素の中でも最初に書く xsl:include xsl:strip-space xsl:preserve-space xsl:output xsl:key xsl:decimal-format xsl:namespace-alias xsl:attribute-set xsl:variable xsl:param xsl:template ※ xsl:copy、element(他諸々)はトップレベル要素ではないので注意
- <xsl:value-of> 以下のような場合、最初のテキストノードが1つだけ選択される。 <xsl:template match="/"> <xsl:value-of select="root/text()" /> </xsl:template> 全てを選択したい場合は、以下のように記述する。(属性は対象外) 方法1: <xsl:template match="/"> <xsl:value-of select="root" /> </xsl:template> 方法2: <xsl:template match="/"> <xsl:apply-templates select="root/text()" /> </xsl:template> <xsl:template match="text()"> <xsl:value-of select="." /> </xsl:template> 以下のように記述すると、指定した要素に繋がっているノードが全て選択される(属性などは対象外)。 XML文書 <root> AAA <sub key="BBB">CCC</sub> <sub>DDD</sub> EEE </root> XSLTスタイルシート <xsl:template match="/"> <xsl:value-of select="root"/> </xsl:template> 出力結果 AAA CCC DDD EEE
- デフォルトの名前空間は、ノードテストの式に影響しない。 例) 誤: <xsl:value-of select="root/sub" xmlns="http://sample/" /> 正: <xsl:value-of select="a:root/a:sub" xmlns:a="http://sample/" />
- <xsl:copy> コピーされるのはカレントノードのみ。 名前空間ノードもコピーされるが、属性ノードはコピーされないので注意。 名前空間ノードは上位の要素ノードで宣言された全てを継承する。
- <xsl:copy-of> 下位構造を含めた部分ツリーをまとめてコピーする。
- 他文書の読み込み 他XML文書の読み込みは、document関数(XSLT追加関数)を使用する。 他XSLTスタイルシートの読み込みは、<xsl:include>や<xsl:inport>を使用。
- <xsl:include> 読み込まれた時点でテンプレート追加される。 複数インクルードした場合は、後にインクルードされたものが優先。 トップレベル要素であれば、どこに記述されてもよい。
- <xsl:import> 読み込んだテンプレートよりも元のテンプレートが優先される。 但し、<xsl:apply-imports />で優先順位を変更できる。 複数インポートした場合は、後にインポートされたものが優先。 トップレベル要素、且つ先頭に記述されなければならない。
- <xsl:apply-imports /> <xsl:template>要素内かつ<xsl:for-each>要素外で使用する。
- <xsl:template>のmatch属性の制限 child軸、attribute軸、「/」、「//」は使用できるが、 「.」や「..」、desendant-or-self軸、変数参照($変数名)は使用できない。 主な表記方法は以下のとおり。 text() 全てのテキストノード node() 全てのノード / ルートノード * 全ての要素ノード @* 全ての属性ノード A 要素名がAという全ての要素ノード A | B 要素名がAまたはBという全ての要素ノード A / B A要素配下のBという名の子要素ノード全て A // B A要素配下のBという子孫ノード全て @C Cという属性ノード全て
- カレントノードの推移 カレントノードが推移する(select属性の値) <xsl:apply-templates> <xsl:for-each> カレントノードは推移しない <xsl:call-template>
- <xsl:call-template> <xsl:call-template>要素内には<xsl:with-param>以外の要素を含むことができない。
- 変数 <xsl:variable> 一度設定した値を変更できない <xsl:param> <xsl:with-param>を使用して値を何度でも変更できる 共通(variable、param) ・変数値は、select属性または子要素として指定するが、同時に指定するとエラーとなる。 逆に両方指定されていない場合はNullとなる。 ・select属性には式を指定する。式は文字列、数値、ブール値、ノードの集合のいずれでも構わない。 ・select属性値に文字列を指定する場合には注意が必要(引用符の中に引用符を使用する)。 <xsl:variable name="x" select="'text'" />
- 述部へ変数を使用する場合の注意 以下の場合、予想に反して「ABC」が出力される。 XML文書 <root> <sub>A</sub> <sub>B</sub> <sub>C</sub> </root> XSLTスタイルシート <xsl:variable name="x">3</xsl:variable> <xsl:value-of select="root/sub[$x]" /> 述語で[$x]を指定すると、数値の3にはならず、真(true)となってしまう。 ([$x]→['3']→[boolean('3')]→[true]と解釈される) 3番目の「C」だけを出力したい場合、以下のような方法で出力する。 方法1) <xsl:variable name="x" select="3" /> <xsl:value-of select="root/sub[$x]" /> 変数値をテキストノードから属性値に切り替える。(属性値は数値型として扱われる) 方法2) <xsl:variable name="x">3</xsl:variable> <xsl:value-of select="root/sub[position()=$x]" /> position()関数が数値を返すので$xも数値扱いとなる 方法3) <xsl:variable name="x">3</xsl:variable> <xsl:value-of select="root/sub[number($x)]" />
- 出力されるXML文書から名前空間を削除するには、xsl:stylesheet要素か、出力されるXML文書の 最上位要素に、 xsl:exclude-result-prefixes属性を追加し、属性値に削除したい名前空間の 接頭辞を指定する。
- xsl:apply-templates要素のselect属性を省略した場合、select="node()"と解釈される。
- XSLTスタイルシート内の要素と要素の間に含まれる空白のみのテキストノードは削除される。 例1)<xsl:value-of select="xxx" /> <xsl:value-of select="yyy" /> ↑ここの空白は削除される。 例2)<xsl:value-of select="xxx" /> = <xsl:value-of select="yyy" /> ↑ここは空白以外の文字も混在しているので削除されない。 ※変換後ツリーに空白記号を保持したい場合は、空白保持したい要素にxml:space="preserve"属性 を使用するか、<xsl:text>要素を指定する。
- XML文書の空白のみテキストノードの扱い - デフォルトでは出力される。 - XML文書内で、xml:space="preserve"属性を指定した要素(内部も含む)は空白出力される。 - XSLTのpreserv-space要素に記述された要素名にマッチすれば空白出力される。 - XSLTのstrip-space要素に記述された要素名にマッチすれば空白出力されない。
- リテラル結果要素で構成されるスタイルシート スタイルシートのルート要素には、<xsl:stylesheet>、<xsl:transform>以外に、リテラル結果要素も 使用することができる。 書式) <文書要素名 xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSLT/Transform"> (テンプレート) </文書要素名> 例) <html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSLT/Transform"> <body> <xsl:value-of select="root/sub" /> </body> ↑絶対パスで指定する必要があるが、ルートの"/"は </html> 有っても無くても構わない。 <xsl:template match="/">は使用できない。
- リテラル結果要素への属性記述 {}を使用して属性値を指定する。 例) <sample att="{root/sub}">
- <xsl:attribute-set> 属性セットをテンプレート外で指定し、流用することができる。 例) <xsl:attribute-set name="sampleSet"> <xsl:attribute name="att1"><xsl:value-of select="/root/sub" /></xsl:attribute> <xsl:attribute name="att2">sample</xsl:attribute> </xsl:attribute-set> <xsl:template match="/"> <xsl:element name="test" use-attribute-sets="sampleSet" /> </xsl:template>
XPath
- XPathでは、CDATAや実体参照は展開され、テキストノードの一部となる。
よって、XPathを使用しているXSLTは、一度読み込んだXMLデータを元の形式に再現することが出来ない。 - カレントノード
目的のノードを指定し始める「出発地点」となるノードを指す。 - コンテキストノード
カレントノードから目的ノードまで経由する中で、現在処理を行っているノードを指す。 -
主な軸の種類 child コンテキストノードの全ての子を選択する descendant 〃 子孫 〃 parent 〃 親 〃 ancestor 〃 祖先 〃 attribute 〃 属性 〃 namespace 〃 名前空間 〃 following-sibling コンテキストノードから文書順で後に続く兄弟ノードを全て選択する preceding-sibling 〃 前 〃 self コンテキストノード自身を指す
- ロケーションステップの構成
preceding-sibling::element[position()=2]/child::element └───┬───┘└─┬┘└───┬─┘│ │ │ 軸 ノードテスト 述部 ││ │ └────────┬─────────┘└──┬───┘ │ ロケーションステップ ロケーションステップ│ └────────────┬─────────────┘ ロケーションパス 軸 … コンテキストノードからみて、選択するノードを含む範囲を指定する ノードテスト … 選択するノードのノード型や名前を指定する 述部 … 選択するノードの集合を、式を使用してさらに細かく選別する
- 述部について
順番を指定する場合、XPathは1から始まる(DOMは0から始まるので混乱しないように)。 例:/child::A/child::B[2] A要素配下の2つ目のB要素を選択している。 軸の方向 ancestor軸、ancestor-or-self軸、preceding軸、preceding-sibling軸は逆順になるので注意。 例) XML文書 <root> <sub>A</sub> <sub>B</sub> <sub>C</sub>←─┐ </root> │ コンテキストノードが3番目の<sub>要素を指している時、 preceding::sub[1] では、 B を指す。 (preceding::sub)[1]では、A を指す。 文字列による絞り込み [要素="値"] 例えば、<child>XSLT</child> という子要素を持つparentを選択する ロケーションステップは、 parent[child="XSLT"] となる。
省略記法
正式な記法 省略記法 child::
attribute::
/descendant-or-self::node()/
self::node()
parent::node()(何も書かない)
@
//
.
..例) attribute::type → type属性 child::para → 子となるpara要素 child::* → 子となるすべての要素ノード(テキスト、処理命令、コメントは含まない) child::node() → 子となるすべてのノード(child::* との違いに注意)
- XPathのルートノード
XPathのデータモデルで最上位にくるものはルートノード。
ルートノードはducument element(文書要素)のノードの親ノードとなる。 - 主なXPath関数
- ノードセット関数(ノード集合関数) position() ノードの位置を表す数値を返す last() ノードの総数を表す数値を返す local-name(node-set) ノードセット内の最初のノードのローカル名を返す namespace-uri(node-set) ノードの名前空間URIを返す name(node-set) ノードセット内の最初のノードの名前を返す - 文字列関数 normalize-space(string1) 文字列の空白を正規化(例:『 a b c 』⇒『a b c』) ※normalize()はDOMの関数なので注意。 concat(string1,string2,...) 連結した文字列を返す contains(string1,string2) string1にstring2が含まれているか判断 - 論理値関数(ブール関数) - 数値関数
DOM
- DOMのエディションはDOMのバージョンと同じ意味。
※DOMレベルとは別物なので注意。 - DOMレベル1とDOMレベル2の主な違いは、「機能のモジュール化」、「名前空間のサポート」、
「Documentオブジェクトの新規作成」、「ノードのインポート」など。
LevelごとのモジュールDOM Level1 Core、HTML DOM Level2 Views、Style、Traversal-Range、Events - DOM Level 2では、12個の基本インターフェース、6個の拡張インターフェースが定義されている。
- DOMでは、読み取れるDTDの情報は以下の項目だけ。
直接「要素型宣言」を取得したり、新規作成することはできない。- DTDの名前
- 記法宣言(notation)、実体宣言(entity)
- 内部サブセットの内容(テキスト)
- 外部サブセットの公開識別子およびシステム識別子
- DOM Level 2では妥当性検証を扱っていない。
(独自で実装しているXMLパーサもあるが、正式にはDOM Level3でサポート予定) - DOMはXML文書の処理過程で正規化などを行うため、DOMツリーが元のXML文書と物理的に全く
同じとは限らない。 - DOMでは実体参照と文字参照は展開してDOMツリーに読み込まれる。
例)「<」は「<&」に展開される。 - CDATAセクションは文字データとして扱われ、前後の文字を連結して出力される。
- DOMでは空白(改行コード、タブ、スペースなど)についての扱いを明確に定義していない。
Textオブジェクトとして認識されたり、無視されたりと、XMLパーサによって扱いが異なる。 - DOM APIは全てインターフェースであり、クラスの実装に関しては扱っていない。
- appendChild、insertBefore、replaceChildはノードを移動するためのメソッド。
参照元のノードが削除されるので注意。通常は、createElementなどで要素を作成し、その要素に対して
処理を行うが、既存の要素を参照元として使用する場合、その参照元ノードは移動されてしまう。
移動でなく、コピーしたい場合は、cloneNode、importNodeなどを使用する。 - DOMのデータ型
以下の2種類のデータ型が存在する- DOMString … DOMで使用する文字列
- DOMTimeStamp … ミリ秒数で表された時刻
- ノードの操作
replaceChild 置き換え insertBefore 前に挿入 removeChild 削除 appendChild 最後に追加 cloneNode(※) 同一のDOMツリー内からコピー importNode(※) 別XML文書からコピー ※第2引数にfalseを指定した場合、子孫ノードはコピーされないが、名前空間、属性はコピーされる。
- NamedNodeMap型を返すアトリビュートは、attributes、entities、notationの3つ。
- getElementsByTagNameメソッドの検索範囲
対象がDocumentノードの場合 文書全体。 対象がElementノードの場合 子孫要素(カレントノードは含まない)。 - 要素内の文字列はElementノードのnodeValueで取得するのではなく、TextノードのnodeValueで取得。
※以下のような似た名前にも注意。
「value」は、DOMのAttrオブジェクトで使用するプロパティ名。
「getValue」は、SAXのAttributeオブジェクトで使用するメソッド名。 - 属性ノード(Attrオブジェクト)の取得方法
- 方法1(属性リストから取得)
Elementオブジェクトのattributes属性(Nodeから継承)でNamedNodeMapを取得し、そこからitemや、
getNamedItemメソッドを使用し、Attrオブジェクトを取得。 - 方法2(属性名から取得)
ElementオブジェクトのgetAttributeNodeメソッドを使用してAttrオブジェクトを取得。
※直接、属性値(テキスト)を取得する方法として、ElementオブジェクトのgetAttributeを
使用することもできる。
- 方法1(属性リストから取得)
- DOMの属性ノードは子ノードとしてテキストノードを持つが、XPath(XSLT)のアトリビュートは
子ノードを持たない。
SAX
- SAX2で新しく追加された機能
・名前空間のサポート
・string-interning(文字列プーリング:効率良く文字列参照) - charctersイベント
SAXで、『 a<b>c 』を読み込んだ場合、charctersイベントは3回通知される可能性がある
(XMLパーサの実装に依存する)。
また、実体参照は変換されるので『 a<b>c 』と出力される。 - SAXでは改行、空白、インデントは「空白文字」として扱われ、これら空白文字はcharactersイベントとして発生する。
「改行、インデント」と続いているような場合、複数回イベントが発生する。
また、妥当性検証によって、これら意味の無いcharactersイベントを抑えることも可能。
これら無視できる空白文字は、妥当性検証を有効(※)にすることにより、ignorableWhitespaceイベント
として通知することもできる。
※妥当性検証を行わないSAXパーサで解析した場合、ignorableWhitespaceは通知されない。
※妥当性検証が有効でもDTD宣言に「root(sub|#PCDATA)*」のように、テキストを有効としている場合はignorableWhitespaceは呼ばれない。 - 妥当性検証、名前空間の使用
SAXで妥当性検証を行いたい場合、フィーチャー(Feature)を以下のように設定する。
XMLReaderインターフェイスのsetFeatureメソッドを使用し、URIとtrueを指定する。
setFeature(“http://xml.org/sax/features/varidation”,true)
名前空間の機能を使用する場合も同様(URIが異なるのみ)。
setFeature(“http://xml.org/sax/features/namespaces”,true)
名前空間接頭辞付きの機能を使用する場合も同様(URIが異なるのみ)。
setFeature(“http://xml.org/sax/features/namespaces-orefixes”,true) - startElementメソッドでは、名前空間URI、ローカル名、修飾名、属性リストを取得できる。
- SAXのパッケージ
[パッケージ] org.xml.sax [インターフェイス] Attributes ContentHandler DTDHandler ErrorHandler EntityResolver Locator XMLFilter XMLReader org.xml.sax.helpers [クラス] Attributeslmpl DefaultHandler Locatorlmpl NamespaceSupport ParserAdapter XMLFilterlmpl XMLReaderAdapter XMLReaderFactory org.xml.sax.ext (SAX2 Extensionsを含んでいる) [インターフェイス] DeclHandler Lexicalandler
※これら拡張イベントハンドラを使用するためには、インターフェースを実装するだけでなく、XMLReaderのsetPropertyメソッドで設定を行う。
Webサービス
- 各XML文書のルート要素名について
ルート要素名 XML-Signature
XML Encyption
WSDL
UDDI
SOAPSignature
EncryptedData
wsdl:difinitions
businessEntity
SOAP-ENV:envelope - UDDIレジストリのデータ構造
┌──────────────┐ │┌────────────┐│ ││businessEntity ││… ビジネス情報 ││┌──────────┐││ 企業名、連絡先、ID番号など(White Pageで検索) │││businessService │││… サービス情報 │││┌────────┐│││ 業種、製品/サービス、場所(Yellow Pageで検索) ││││bindingTemplate ││││… バインド情報 ││││ ↑ ││││ 技術情報、アクセスポイント(URL)、tModelへの参照 │││└──────┼─┘│││ (Green Pageで検索) ││└───────┼──┘││ │└────────┼───┘│ │ ┌────┼──┐ │ │ │tModel ↓ │ │… サービス記述 │ └───────┘ │ 具体的な仕様の記述など └──────────────┘
- WSDLの構造
<definitions> 名前空間を定義 <types>データ型を定義</types> <message>データの集合を定義</message> <portType> <operation>message要素の種類を指定</operation> </portType> <binding>フォーマットを定義</binding> <service> <port>URI</port> </service> </definitions>
- セキュリティ
- Canonical XML
文書全体を正規化 - Exclusive XML Canonicalization
部分的な正規化 - XML Signature
電子署名 - XML Encryption
暗号化(XML全体/一部どちらでも可)
- Canonical XML
- XMLのセキュリティの手順
- 正規化
- 電子署名の追加
- 暗号化
- XML Signatureによる電子署名の手順
- ダイジェスト値の算出
- ダイジェスト値を秘密鍵で暗号化
- 署名としてXML文書に添付
- 正規化のルール
- 文字のエンコーディング方式をUTF-8に統一
- 改行文字は#A
- 属性の表記順は辞書順
- 文字参照やパース可能なEntity参照を展開
- CDATAセクションを内容に置き換える
- XML宣言、DTD宣言は出力しない
- 空要素は、開始タグと終了タグを続ける
- SOAPについて
- SOAPはW3Cの勧告ではなく、W3Cの技術ノートとして公開されている。
- SOAPをHTTPを使用しリクエストする場合、SOAPActionというHTTPヘッダを付ける。
- SOAPエンコーディングは大きく分けて、単純型、複合型の二種類がある。
複合型は更に、構造型、配列の二種類に分けられる。
- SOAPメッセージの形式
<SOPA-ENV:Envelope xmlns:SOPA-ENV="http://schemas.xmlsoap.org/soap/envelope/" soap-env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" > Envelope要素で名前空間の指定やエンコーディングの指定を行う。 名前空間の宣言は必ずこのルート要素で行う。 <SOAP-ENV:Header> Header要素はオプション。指定する内容は自由。 <s:sample xmlns:s="http://sample" SOAP-ENV:mustUnderstand="1" SOAP-ENV:actor="http://sample/actor"> 処理を強制させたい要素がある場合は、その要素にactor、mustUnderstand属性を指定する。 ・mustUnderstand属性:"0"か"1"を指定。"1"を指定した場合、この要素の処理を強制する。 もし処理できなかった場合、エラーとして返しそれ以上先に進めない。 ・actor属性:処理して欲しい中継サーバのURIを指定。 </s:sample> </SOAP-ENV:Header> <SOAP-ENV:Body> Body要素は必須。指定する内容は自由。エラーが発生した場合、Fault要素を使用する。 <SOAP-ENV:Fault> Fault要素にはエラー情報を格納する。Fault要素内では名前空間を指定しない。 <faultcode> 必須:エラーは以下の4種類。 SOAP-ENV:VersionMismatch,SOAP-ENV:MustUnderstand,SOAP-ENV:Client,SOAP-ENV:Server </faultcode> <faultactor>必須:エラー発生元URI。</faultactor> <faultstring>エラーの概要。</faultstring> <detail>エラー詳細内容。任意の子要素も追加できる。</detail> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOPA-ENV:Envelope>
模擬問題
以下の模擬問題は、実際に出題された問題を思い出して作成したものです。
細かいところまで憶えていないので悪しからず。
【例題1】 DOMでa.xmlの「ns:testA」属性を、inportNodeでb.xmlの「ns:root2」要素の属性としてコピーした場合、 b.xmlは、どのような結果になるか。 a.xml <ns:root1 xmlns:ns="http://sampleA" /><sub ns:testA="TEST1" /></ns:root1> b.xml <ns:root2 xmlns:ns="http://sampleB" ns:testB="TEST2" /> A. <ns:root2 xmlns:ns="http://sampleB" ns:testB="TEST2" ns:testA="TEST1" /> B. <ns:root2 xmlns:ns="http://sampleA" ns:testB="TEST2" ns:testA="TEST1" /> C. <ns:root2 xmlns:ns="http://sampleB" ns:testA="TEST2" xmlns:ns="http://sampleA" ns:testA="TEST1" /> D. <ns:root2 xmlns:ns="http://sampleB" ns:testB="TEST2" ns2:testA="TEST1" xmlns:ns2="http://sampleA" /> 予想される正解:D I.E.で動作確認するとDが近い。 接頭辞は、"ns2"ではなく"dlpl"と出力されたが、これはXMLパーサの実装に依存する?
【例題2】 XML-Signatureで電子署名を追加するときに必要な作業として、間違えているものを1つ選べ。 A. Canonical Form B. 暗号キーの作成 C. ダイジェストの計算 D. 名前空間の削除 予想される正解:D Canonical Formは、正規化を意味しているようです。 また、XML-Signatureは、名前空間も含む事ができます。多分。
【例題3】 test.xmlを読み込み、test.xslを実行し「B」を出力したい。【1】 に入れる正しい述部を全て選べ。 test.xml <?xml version="1.0" ?> <root> <sub x="1" y="2">A</sub> <sub x="3" y="4">B</sub> </root> test.xsl <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <xsl:value-of select="root/sub 【1】 " /> </xsl:template> </xsl:stylesheet> A. [@x="3"][@y="4"] B. [@x='3'][@y='4'] C. [@x='3' | @y='4'] D. [@x=3] || [@y=4] E. [@x='3'][//sub/text()='B'] 正解:B、E Aは、ダブルクォーテーションの中にダブルクォーテーションを指定しているのでエラーです。 ちなみに、シングルクォートを外してもI.E.で動作します([x=3][y=4])。 これも対策本では出てこない問題なので注意が必要です。
断片的ですが、その他に以下のような問題がありました。
- XMLパーサにはDOMが必ず必要か? →NO
- XMLパーサにはSAXが必ず必要か? →NO
- WebサービスでWSDLを省略した場合、SOAPのエンコーディングしか使用できない? →NO?
- SOAPにDTDを追加して妥当性検証することができるか? →NO?
- SOAPのエンコーディングはXML Schemaでしか出来ない? →NO
- SAXで、要素が見つからなかった場合、どのインターフェースで処理が行われるか? →?
- SOAPのBody要素は2つ書ける? →NO?
- DOMで、prefix(接頭辞)は書き換え可能か(子孫ノードの接頭辞の影響範囲も要確認)? →YES
- DOMで、element(要素名)は書き換え可能か? →NO
おまけ
- 問題文は結構抽象的な言葉が多いです。例えば以下のような問題が出題されました。
例題) XSLTで他の文書を読み込みたいときに使用するものはどれか。 A. xsl:import B. xsl:include C. document() D. 他の文書を読み込む手段はない。 この例題で指している「文書」とは「XSLTシート」ではなく「XML文書」を指しているので答えは多分 Cのdocument()関数になると思います。
- 3階層アプリケーションでXMLが使用できる層を選ぶ問題は、対策本によって答えが異なりました。
実際の試験問題を見た感じですと、「プレゼンテーション層」「ロジック層」「データ層」全てでXMLが使用可能というのが答えのようです。多分。 - はっきり言って対策本無しでは合格は困難です。
しかも最低2冊以上読まないと合格は難しいです。(⇒@IT記事)
私のお勧めの対策本は以下です。[1]@ITハイブックス 徹底攻略XMLマスター教科書 [2]翔泳社 XMLマスター教科書 [3]技術評論社 標準XML完全解説(下) [4]iStudy [5]W3Cの仕様書(日本語訳は⇒http://www.doraneko.org/xml/ )
XMLマスターV2・プロフェッショナル向け対策本
[1]@ITハイブックス
徹底攻略XMLマスター教科書[2]翔泳社
XMLマスター教科書[3]技術評論社
標準XML完全解説(下)[4]XMLマスター教科書+iStudy プロフェッショナルV2 お勧めする学習順序は、XMLマスター教科書 プロフェッショナル V2を勉強し、少し難しい徹底攻略 XMLマスター教科書 プロフェッショナル編にステップアップし、解らない部分をその都度標準XML完全解説〈下〉で徹底的に調べる。
といった感じだと思います。ちなみに、XMLマスター・ベーシックは以下の対策本がお勧めです。
by AffiliSearch