Olen onnellinen.

あしたもどこかで NullPointerException。資格試験とかシステム開発の記録だったりなかったり。

XMLマスターベーシックV2:実際に使ってみる

■ スキーマ定義言語
DTDとXML Schemaのこと。DTDの欠点を改善したものがXML Schemaと考えます。
試験対策としてはDTDまたはXML SchemaとXML文書が与えられたときにそのXML文書が妥当であるかどうかを正確に判断できるようになる必要があります。

例えば、次のようなDTDとXML文書を考えます。

DTD(character.dtd)

  1.  <!ELEMENT character (name, birthday)>
  2.  <!ELEMENT name (#PCDATA)>
  3.  <!ELEMENT birthday (#PCDATA)>
  4.  <!ATTLIST character type (戦士|魔法使い) #REQUIRED>


XML文書(character.xml)

  1.  <!DOCTYPE character SYSTEM "character.dtd">
  2.  <character type="盗賊">
  3.   <name>ごえもん</name>
  4.   <birthday>1600-05-05</birthday>
  5.  </character>



このXML文書は妥当ではありませんとなる。
また、DTDの制限として上記の要素nameとbirthdayのデータ型が同じになっています。XML SchemaではDate型など様々なデータ型を利用できます。

XML Schema

  1.  <?xml version="1.0" encoding="UTF-8" ?>
  2.  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  3.   <xs:element name="character" type="characterType"/>
  4.  
  5.   <xs:complexType name="characterType">
  6.   <xs:sequence>
  7.   <xs:element name="name" type="xs:string"/>
  8.   <xs:element name="birthday" type="xs:date"/>
  9.   </xs:sequence>
  10.   <xs:attribute name="type" type="typeType"/>
  11.   </xs:complexType>
  12.  
  13.   <xs:simpleType name="typeType">
  14.   <xs:restriction base="xs:string">
  15.   <xs:enumeration value="戦士"/>
  16.   <xx:enumeration value="魔法使い"/>
  17.   </xs:restriction>
  18.   </xs:simpleType>
  19.  </xs:schema>



さらに誕生日が非公開であるときなどを現すときはunion要素などで複数のデータ型を許可することもできます。(誕生日を空欄にすること違うってことは自明ですよね)


■ XSLT
試験対策としては「XML + XSLT = 出力結果」の関係において、2つが与えられたときに残りの1つを答えられるようになれば十分です。

以下のXML文書があります。

  1.  <?xml version="1.0" encoding="UTF-8"?>
  2.  <?xml-stylesheet type="text/xsl" href="XSLTファイルへのパス"?>
  3.  <characters>
  4.   <character>
  5.   <name>りんかるくん</name>
  6.   <birth>05-05</birth>
  7.   <height>150</height>
  8.   <weight>88</weight>
  9.   </character>
  10.   <character>
  11.   <name>デュークさん</name>
  12.   <birth>08-08</birth>
  13.   <height>45</height>
  14.   <weight>45</weight>
  15.   </character>
  16.  </characters>


以下の4つのXSLTの中でこのXML文書に適用した結果が異なるものを選んでください。
A

  1.  <?xml version="1.0" encoding="UTF-8"?>
  2.  <xsl:stylesheet xmlns:xsl="http://www.w3c.org/1999/XSL/Transform" version="1.0">
  3.   <xsl:output method="html"/>
  4.  
  5.   <xsl:template match="/">
  6.   <html>
  7.   <head><title>xslt test</title></head>
  8.   <body>
  9.   <xsl:apply-templates select="characters"/>
  10.   </body>
  11.   </html>
  12.   </xsl:template>
  13.  
  14.   <xsl:template match="characters">
  15.   <p>キャラクターの名前</p>
  16.   <xsl:value-of select="character/name"/>
  17.   <br />
  18.   </xsl:template>
  19.  </xsl:stylesheet>



B

  1.  <?xml version="1.0" encoding="UTF-8"?>
  2.  <xsl:stylesheet xmlns:xsl="http://www.w3c.org/1999/XSL/Transform" version="1.0">
  3.   <xsl:output method="html"/>
  4.  
  5.   <xsl:template match="/">
  6.   <html>
  7.   <head><title>xslt test</title></head>
  8.   <body>
  9.   <xsl:apply-templates select="characters/character"/>
  10.   </body>
  11.   </html>
  12.   </xsl:template>
  13.  
  14.   <xsl:template match="character">
  15.   <p>キャラクターの名前</p>
  16.   <xsl:value-of select="name"/>
  17.   <br />
  18.   </xsl:template>
  19.  </xsl:stylesheet>



C

  1.  <?xml version="1.0" encoding="UTF-8"?>
  2.  <xsl:stylesheet xmlns:xsl="http://www.w3c.org/1999/XSL/Transform" version="1.0">
  3.   <xsl:output method="html"/>
  4.  
  5.   <xsl:template match="/">
  6.   <html>
  7.   <head><title>xslt test</title></head>
  8.   <body>
  9.   <xsl:for-each select="characters/character">
  10.   <p>キャラクターの名前</p>
  11.   <xsl:value-of select="name"/>
  12.   </xsl:for-each>
  13.   </body>
  14.   </html>
  15.   </xsl:template>
  16.  </xsl:stylesheet>



D

  1.  <?xml version="1.0" encoding="UTF-8"?>
  2.  <xsl:stylesheet xmlns:xsl="http://www.w3c.org/1999/XSL/Transform" version="1.0">
  3.   <xsl:output method="html"/>
  4.  
  5.   <xsl:template match="/">
  6.   <html>
  7.   <head><title>xslt test</title></head>
  8.   <body>
  9.   <xsl:for-each select="characters/character"/>
  10.   <xsl:call-template name="char_tmp"/>
  11.   </xsl:for-each>
  12.   </body>
  13.   </html>
  14.   </xsl:template>
  15.  
  16.   <xsl:template name="char_temp">
  17.   <p>キャラクターの名前</p>
  18.   <xsl:value-of select="name"/>
  19.   <br />
  20.   </xsl:template>
  21.  </xsl:stylesheet>



解答は【 A 】となります。
それぞれがどのような処理を行っているのかよく確認してみてください。

XSLTを使えば、『キャラクターを身長順に並べて出力』や『体重が50より小さいキャラクターの一覧を出力』なんてこともできます。

このエントリーを含むはてなブックマーク | 

XMLマスターベーシックV2:XML Schemaや名前空間まとめ

■ XML Schema

  1.  <xs:simpleType name="MyType">
  2.   <xs:restriction base="xs:int">
  3.   <xs:minInclusive value="10"/>
  4.   <xs:maxExclusive value="100"/>>
  5.   </xs:restriction>
  6.   </xs:simpleType>
  7.  <xs:element name="data" type="MyType"/>


xxInclusive はその値を含み、xxExclusive はその値を含まない

つまり、data は以下の条件を満たす整数。

10 <= data < 100

出現回数の maxOccurs のデフォルト値は1。

  1.  <xs:element ref="hoge" minOccurs="0"/>

↑の場合、出現回数は0か1。

minOccurs > maxOccurs

だったらどうなんだとかちょっと思いましたが放置。

・ fixed 属性
   空要素の場合にfixed属性に指定した固定値が渡る。しかし、要素自体が存在しない場合は渡らない。(当然か)


■ 名前空間

  1.  <aaa xmlns="http://hogehoge.com/ns1">
  2.   <bbb xmlns="http://hogehoge.com/ns2">
  3.   <data attr="abc"/>
  4.   </bbb>
  5.  </aaa>


ここで、data は"http://hogehoge.com/ns2"に属し、attrはどこにも属さない。
属性は名前空間接頭辞によって明示されない限り、どの名前空間にも属さない。

・ 名前空間接頭辞が異なっていても宣言された名前空間識別子が同じであれば同一のものとなる。
・ スキーマの名前空間はschema要素のtargetNamespace属性に指定

■ XPath
属性の指定
・ hoge/@att カレントにあるhoge要素のatt属性
・ //@att 文書全体にあるatt属性
・ @att カレントノードのatt属性
・ hoge//@att カレントにあるhoge要素以下のatt属性

関数
・ substring 関数

開始位置の指定は先頭を"1"として数える(゚◇゚;)

関数名は小文字の"-"区切り。キャメルケースなら誤り。と判定してよいかも。


■ 仕様
XML 1.0の仕様と名前空間は別々の仕様。そんなことを問う問題もある。


■ DTD
・ NMTOKEN
属性値の先頭に数字を書いても良い。#とかはだめ。


このエントリーを含むはてなブックマーク | 

XMLマスターベーシックV2:XSLT周辺のまとめ

■ XSL
XSL には二つの機能があるそうな。
一つは XSLT。データ構造の変換を行う。
そしてもう一つが XSL-FOであり、書式設定を行う。HTML でいうところの CSS みたいなものか。

現在はどうか知らんが、XML + XSL-FO よりも、(XML + XSLT => HTML) + CSS が一般。
webブラウザで表示することが多いですからね。

試験問題では深くつっこまれたことを聞かれないので、
記述方法とかは (゚ー゚ノ)ノ⌒


■ XSLT
XSLT をプログラムと呼ぶか?はいろいろあると思いますが、
実際に手を動かした方が覚えやすいと思います。

ではまず、xmlファイルを用意します。


mail.xml

  1.  <?xml version="1.0" encoding="UTF-8" ?>
  2.  <?xml-stylesheet type="text/xsl" href="mail_view.xsl" ?>
  3.  <mail>
  4.   <date>2006-10-18</date>
  5.   <to>valkyrie@walhalla.xxx</to>
  6.   <from>Odin@walhalla.xxx</from>
  7.   <subject>めーるたいとる</subject>
  8.   <mbody>本文。ないしょないしょ</mbody>
  9.  </mail>



これは適当につくった一通のメールを表しています。

xslファイルを作ります。

mail_view.xsl

  1.  <?xml version="1.0" encoding="UTF-8"?>
  2.  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  3.  <xsl:output method="html" encoding="UTF-8"/>
  4.  
  5.   <!-- ルートでは各テンプレートを呼び出します -->
  6.   <xsl:template match="/">
  7.   <html>
  8.   <head></head>
  9.   <body>
  10.   <xsl:apply-templates/>
  11.   </body>
  12.   </html>
  13.   </xsl:template>
  14.  
  15.   <xsl:template match="mail">
  16.   <h1>メール</h1>
  17.   <table border="1">
  18.   <tr>
  19.   <th>日付</th>
  20.   <td><xsl:value-of select="date"/></td>
  21.   </tr>
  22.   <tr>
  23.   <th>宛先</th>
  24.   <td><xsl:value-of select="to"/></td>
  25.   </tr>
  26.   <tr>
  27.   <th>差出人</th>
  28.   <td><xsl:value-of select="from"/></td>
  29.   </tr>
  30.   <tr>
  31.   <th>件名</th>
  32.   <td><xsl:value-of select="subject"/></td>
  33.   </tr>
  34.   <tr>
  35.   <th>本文</th>
  36.   <td><xsl:value-of select="mbody"/></td>
  37.   </tr>
  38.   </table>
  39.   </xsl:template>
  40.  </xsl:stylesheet>


先ほどの一通のメールに対して、htmlのテーブルで表示するように変換するXSLTです。

この2つのファイルを同じディレクトリに置いて、mail.xmlをIEとかfirefoxで開くと変換されたテーブルが表示されます。

…なんか試験対策からは外れちゃいましたか?


■ おまけ
・出力の文書にコメントを記述する。
  1.  <xsl:comment>コメントの文字列ですよ</xsl:comment>


・ソースのノードをすべてコピー
  1.  <xsl:copy-of select="xpath式"/>


このエントリーを含むはてなブックマーク | 

XMLマスターベーシックV2概要

■ XML マスターとは
「XMLマスター」はXML及びXML関連技術についての技術力を測る技術者認定制度です。「XMLマスター」を取得することにより、個人の技術力の強化を図れるとともに、お客様の満足度を向上させることができます。また、ITエンジニアとしての雇用、昇進、キャリアプランニングに対しても確実な指標となります。
XML技術者育成推進委員会


だそうです。"お客様の満足度を向上させることができます。"が引っかかりますが気にしません。

■ XMLマスターベーシックV2の概要
試験名 XMLマスターベーシックV2
合格ライン 80%(35/50)
受験 APTC
サイト XMLマスター
資格試験の受験なら | プロメトリック
試験内容 XML概要
XML文書の作成
DTD
XML Schema
XSLT, XPath
名前空間



ざっと問題見た感じでは、結構細かいこと聞かれるように思いました。
XMLに慣れ親しんでいる方も勉強した方が良いかと思います。

XML SchemaやXSLTは知らない人は存在すら知らないでしょうしね。


続いて試験範囲をざっと流し読みしてメモをとりました。
XSLT あたりがポイントになりそうな気がします。

■ 基本
・ XMLインスタンスは必須
・ 拡張子に規則はない
・ 大文字小文字を区別する
・ コメントでは"\-\-"のみ使用できない("-"を2つ続けること)
・ 宣言はversion、encoding、standaloneの順番
・ versionのみ必須
・ 宣言自体は省略できる
・ デフォルトの文字コードはUTF-8またはUTF-16

■ DTD
スキーマ定義言語。他にも"XML Schema"がある。それ以外は試験対象外。
・ 属性の細かい定義ができない

■ XSLT
XML文書 → XML文書の変換を行う簡易言語。

・ xsl:for-each
・ xsl:if test="条件"
・ xsl:choose
    xsl:when test="条件"
    xsl:otherwise test="条件"
・ xsl:sort
    記述できる場所に注意

なんかJSPみたいですね。あれ?逆?

■ XPath
XML文書のアドレッシングのための言語。

■ XML Schema
DTDの欠点に対する改善がなされている。

・ 組み込みデータ型
    xsd:string,xsd:IDなど
・ 単純型
    組み込みデータ型に制限を設定したもの。
    xsd:restriction で定義する。
    xsd:intに最大値の設定する。etc..
・ 複合型
    要素構造を定義する。
※ xsdはXML Schemaの名前空間。別に何でも良いようだが、xs や xsd が使われることが多い。

・ 関連付けはDOCTYPEではない。
・ 利用するにはXMLパーサがXML Schemaをサポートしている必要がある。

・ complexType の mixed

以下なXML Schema

  1.  <xs:complexType mixed="true">

これは、

  1.  <!ELEMENT homyu (#PCDATA|hoge)*>

のようなもので、省略時のデフォルトは"false"とのこと。
なんか手元の教科書にはなかったのでメモ。


実際に問題も解いていきます。

◆ XML Schemaで日付を表すデータ型を選択してください。
 □ A. date
 □ B. gDate
 □ C. day
 □ D. gDay

正解は A , D です。この先頭につく"g" というのはグレゴリオ暦かな?
dateは"g"をつけず、gDay , gMonth は"g"をつけるようです。
dateもグレゴリオですよね。(゚ー゚)?
どう解釈すれば覚えやすいのでしょうね。。

年月日は"g"をつけないが、年月(gYearMonth)や日(gDay)はつける。
つまり三つ揃うとつけない。

わかりにくい?(*゜ヘ゜*)


参考にさせて頂いたサイト様です。

XMLカレッジ@@IT

このエントリーを含むはてなブックマーク | 
Copyright © 2008 hydra404 all rights reserved.