XSLがターゲットとするXMLには、名前空間の概念がある。
名前空間は、使用にあたっては、世界中、唯一無二なURIを用いて、名前空間を定義しなくてはならない。
このURI、唯一無二でありさえすればいいのかと思いきや、その値がスタイルシートの中だけでなく、変換対象のターゲットXMLとも一致している必要がある。
(つまり、自分で作るXMLもその時の気分で名前空間を作ったりすると、XSLTのスタイルシートを作る時にはまるということだ)
SAXONを使って、UML 1.4ベースのXMIを利用できるようにしようと作業していた。
UML 1.4ベースのツールでは、UML: という、名前空間の接頭が付くケースが非常に多い。昨日、見事にはまったのが、この UML: であった。
URIが一意でありさえすればいいと思っていた私は、UML 2.1のURIを少し書き換え、適当なURIを作成して名前空間の定義としておいた。
開発を進めていくと、大きなトラブル。タグがselectを使っても、全くヒットしないのだ。
name()=’UML:Class’のように明示的に比較オペレータを使えばいいのだが、XSLTの解としては、美しくない。
散々悩んだあげく、URIをターゲットのXMLモデルからコピペしてみると、なぜか動いていそう!?
名前空間はターゲットのXMLを含め、整合性が取れてないといけない。一つ勉強した 🙂