girファイルの解析xsltproc編

girファイルをxsltprocで読みやすくしたいと思います。と言っても、今回はとっかかりだけです。

$ xsltproc -o Gtk-2.0.html gir01.xsl /usr/share/gir-1.0/Gtk-2.0.gir

これで/usr/share/Gtk-2.0.girをhtml形式に変換します。すべてのtagを解析するのは面倒なので、とりあえずタグのみを取り出し、列挙します。
変換で利用したgir01.xslファイルは以下の通りです。

<?xml version="1.0"?>
<xsl:stylesheet
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:gir="http://www.gtk.org/introspection/core/1.0"
	version="1.0">
<xsl:output 	method="html"/>

	<xsl:template match="gir:repository">
		<html>
			<body>
				<ul>
					<xsl:apply-templates select="gir:include"/>
				</ul>
			</body>
		</html>
	</xsl:template>

	<xsl:template match="gir:include">
		<li>
			<xsl:value-of select="@name"/> version=<xsl:value-of select="@version"/>
		</li>
	</xsl:template>
</xsl:stylesheet>

今回はまったのは、xmlファイルでxmlnsというxmlのnamespaceを使っている場合に度のようにしてmatchさせるか知らなかったことから、で全然matchしてくれなくてmatch="/"だけでどうにかするのか?と2日ほど悩んでしまいました。

<xsl:stylesheet
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:gir="http://www.gtk.org/introspection/core/1.0"
	version="1.0">

この部分で、Gtk-2.0.girの最初にある、

<repository version="1.0"
            xmlns="http://www.gtk.org/introspection/core/1.0"
            xmlns:c="http://www.gtk.org/introspection/c/1.0"
            xmlns:glib="http://www.gtk.org/introspection/glib/1.0">

これのxmlnsに対応できます。そして、template matchには、のように gir: を前置すればきちんとmatchします。それまで、 "http://www.gtk.org/introspection/core/1.0/repository" とか、 "{http://www.gtk.org/introspection/core/1.0}repository"とか書いてはまってました。
ちなみに、上記でできるhtml形式は以下のようになります。

<html xmlns:gir="http://www.gtk.org/introspection/core/1.0"><body><ul>
<li>Atk version=1.0</li>
<li>GLib version=2.0</li>
<li>GModule version=2.0</li>
<li>GObject version=2.0</li>
<li>Gdk version=2.0</li>
<li>GdkPixbuf version=2.0</li>
<li>Gio version=2.0</li>
<li>Pango version=1.0</li>
<li>cairo version=1.0</li>
</ul></body></html>

girファイルは階層が深く、要素もたくさんあり、textじゃなくてattributeにすべてが書かれているため、@を多用することになりますが、多分なんとかなるんじゃないかな?と思っています。

まあ、Gtk-2.0.girは とそれ以下のtag ぐらいが表示されればいいと思います。実際は、xmlns:c="http://www.gtk.org/introspection/c/1.0" とかを使って、c:namespaceからgtk+-2.0のドキュメントを調べた方が早いかもしれませんが、、、