tohokuaikiのチラシの裏

技術的ネタとか。

XSLTにおけるXMLのデフォルトネームスペースについて

ドはまり。

変換元XMLでネームスペースを

<?xml version="1.0" encoding="UTF-8"?>
<ac:confluence 
	xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ac="http://www.atlassian.com/schema/confluence/4/ac/"
	xmlns:ri="http://www.atlassian.com/schema/confluence/4/ri/"
	>

ってやってて、XSLで

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
	xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ac="http://www.atlassian.com/schema/confluence/4/ac/"
	xmlns:ri="http://www.atlassian.com/schema/confluence/4/ri/"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	>

ってしてると、XPath表現でどうやっても普通のXHTML系のタグが引っかからない。

XSLT でありがちな失敗を避けるために によると、

XPath名前空間が設定された要素にアクセスするには、該当する名前空間に接頭辞を定義する必要があります。例えば、サンプル XHTML 文書のタイトルにアクセスするには、XHTML 名前空間に接頭辞を定義し、その接頭辞をすべての XPath ステップで使用します。(略)
ここでも同じく、XPath 式での接頭辞には十分な注意が必要です。1 つでも接頭辞が欠けていると、誤った結果になってしまいます。

な、なんだってー!!!

ということで、XMLではデフォルトだった「http://www.w3.org/1999/xhtml」のネームスペースにも新たに接頭辞を振ってやる必要がある。
こんな感じで「h」プレフィクスを使用。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
	xmlns:h="http://www.w3.org/1999/xhtml"

そして、XPath表現では、

<xsl:template match="h:table">
      <table>

という感じ。「XML上のデフォルトネームスペース=XSL上のデフォルトネームスペース」としていてもそれを暗黙で一致させてくれないんですね。