XSLT と文書の変換,名前空間

Download Report

Transcript XSLT と文書の変換,名前空間

応用Java(Java/XML) 第7回
2006年6月16日
植田龍男
後半の内容の予定
XPath (6/9)
 XSLT (6/16)
 名前空間(Namespace) (6/16)
 XML文書の妥当性の検証(6/23)
DTD,XML Schema
 SOAP, RMI (7月以降)

J2SE 5.0 と XML API










javax.xml
javax.xml.parsers
javax.xml.transform
javax.xml.transform.dom
javax.xml.transform.sax
javax.xml.transform.stream
javax.xml.xpath
javax.xml.namespace
javax.xml.validation
javax.xml.datatype
javax.xml.transform




javax.xml.transform
javax.xml.transform.dom
javax.xml.transform.sax
javax.xml.transform.stream
XSLTとは?



XSL Transform
XML文書を別の形式の文書へ変換
XSL(eXtensible Stylesheet Language)
変換のルールもまたXML文書で記述
(XSLファイル)
変換前の文書、変換後の文書、変換のた
めの文書
変換前の文書の例
<document>
<title>Java and XML</title>
<text>
Let's begin, now!
</text>
<image s="java.png" w="128"
h="64"/>
</document>
XSLTによる変換の例(1)
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/
XSL/Transform">
<xsl:template match="/">
:
</xsl:template>
</xsl:stylesheet>
XSLTによる変換の例(2)
<xsl:template match="text">
<p>
<xsl:apply-templates />
</p>
</xsl:template>
XSLTによる変換の例(3)
<xsl:template match="title“
mode="inhead">
<title>
<xsl:apply-templates />
</title>
</xsl:template>
XSLTによる変換の例(4)
<xsl:template match="image">
<img>
<xsl:attribute name="src">
<xsl:value-of select="@s"/>
</xsl:attribute>
</img>
</xsl:template>
参照:XPath の検索パターン
abc
//abc
abc[1]
@xyz
XSLT のAPI(1)



javax.xml.transform パッケージ
インタフェース Source
抽象化された入力元
変換前の文書
変換のXSLファイル
インタフェース Result
抽象化された出力先
変換後の文書
SourceやResultの実体は?
ローカルファイル
 Web上の資源
 DOMツリー
 SAXで処理中の文書
*それぞれに応じて実体を提供
3つのサブパッケージの役割り
処理そのものに違いは生じない

XSLT のAPI(2)
Source inputSource
= new StreamSource( "sample6.xml" );
Source transSource
= new StreamSource( "trans.xsl" );
Result outputResult
= new StreamResult( System.out );
XSLT のAPI(3)

Transofromerクラス
変換を実行する抽象クラス
TransformerFactory tf
= TransformerFactory.newInstance();
Transformer transformer
= tf.newTransformer( transSource );
XSLT のAPI(4)

変換の実行
transformer.transform(
inputSource, outputResult );
*これでResultに結果が格納
変換後の文書の例
<html>
<head> <title>Java and XML</title>
</head>
<body>
<h1>Java and XML</h1>
<hr>
<p> Let's begin, now!
:
ところで気になることが・・・
<xsl:template match="text">
の xsl: ってどういう意味?
 <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/
XSL/Transform">
のURIは何の働きをしているの?

名前空間とは?



名前の衝突の回避(一意性の保証)
ローカル名の前に「場所」を指定
XML以外でも利用
XMLの名前空間の例(1) Prefix
<wakhok:image
source="java.png“
width="512" height="400"/>
:
<tatsuo:image
src="elephant.png“
w="64“ h="64"/>
XMLの名前空間の例(2) URI
<wakhok:document
xmlns:wakhok
="http://www.wakhok.ac.jp/public"
xmlns:tatsuo
="http://www.wakhok.ac.jp/tatsuo">
<wakhok:title>
Java and XML</wakhok:title>
:
</wakhok:document>
名前空間の例(3) 有効範囲
<tatsuo:image
src="elephant.png“
w="64" h="64"
xmlns:tatsuo
="http://www.wakhok.ac.jp/tatsuo"/>
名前空間の例(4) Prefixの省略
Prefixの名称を省略(URIのみ指定)
 この場合でも立派な名前空間
<document
xmlns="http://www.wakhok.ac.jp/">
<title>Java and XML</title>
<image s="java.png" w="128"
h="64"/>
</document>

名前空間の例(5) 特別なPrefix


xmlns: はなぜURIなしでもいいのか?
xml で始まるプレフィックスは特別
(一般のXML文書では使用できない)
<xml:image source="elephant.png"
xmlns:xml="http://www.wakhok.ac.jp"/>
この表記はエラーとなる
名前空間の処理(1)

パーサへの通知(Factoryクラスに)
SAXParserFactory spf
= SAXParserFactory.newInstance();
spf.setNamespaceAware( true );
SAXParser parser = spf.newSAXParser();
名前空間の処理(2)

PrefixとURIの処理がポイント
void startElement(
String uri,
String localName,
Stirng qName,
Attributes attr )
SAX処理での名前空間の検知


ある名前空間の有効範囲に入った時
startPrefixMapping( String p, String u)
ある名前空間の有効範囲が終わった時
endPrefixMapping( String p )
javax.xml.namespace


たった1つのインタフェース
NamespaceContext
たった1つのクラス
QName
NamespaceContext






3個のメソッドの実装を要求
プレフィックスとURIの変換の手段
getNamespaceURI( String prefix)
getPrefix( String uri )
getPrefixes( String uri )
URI : Prefix は1対他の可能性もある
QName (Qualified Name )





URI, Prefix, ローカル名の情報を格納
QName(String local)
QName(String uri, String local)
QName(String uri, String local, String prefix)
getLocalPart(), getPrefix()
getNamespaceURI()
equals() – URIとローカル名のみで判定
toString() – { URI }localName の形式
Quorified Name

Qnameクラスの利用例
public void startElement(
String nameSpace, String localName,
String qName, Attributes attrs ) {
System.out.println(
new QName( nameSpace, localName ) );