Python Pyanaを使用して、xml+xsltを混ぜ合わせる
せっかくeXist(XMLDB)を使用するのだから、XMLを
一旦Pythonオブジェクトに変換するのではなく、
そのままxsltで指定したスタイルと混ぜ合わせて
htmlを作成してやろうと思います。
なにかいいモジュールはないかと探していたのですが、
http://paison.hp.infoseek.co.jp/paison/xml/pyana.html
Pyanaというモジュールがあるようです。
早速、これを使ってみることに。
eXistの/db/sampleコレクションにtest.xmlというドキュメントを
作成しました。
内容は以下の通り
<data>
<demo no="0000000001">
<title>テストタイトル</title>
<details>テストデータ1</details>
</demo>
</data>
表示用のスタイルシートはこんな感じです。
■details.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="data">
<html>
<head>
<title><xsl:value-of select="demo/title" /></title>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td>タイトル</td><td><xsl:value-of select="demo/title" /></td>
</tr>
<tr>
<td>詳細</td><td><xsl:value-of select="demo/details" /></td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Pythonのソースコードは
import xmlrpclib
import Pyana
def readfile(filename):
f = open(filename, "r")
result = f.read()
f.close()
return result
if __name__ == '__main__':
xmlrpc_url = 'http://www.example.com:8080/exist/xmlrpc'
srv = xmlrpclib.ServerProxy(xmlrpc_url)
query = '/db/sample/test.xml'
xml_data =srv.getDocumentAsString(query, {})
f = open('out.html', 'w')
f.write( Pyana.transform2String(source=xml_data, style=readfile('details.xsl')) )
f.close()
これで、xml+xsltを混ぜ合わせた結果がout.htmlに
出力されるはず。
・・・と思っていたのですが
return t.transform2String(source, style)
TypeError: reader or input object excepted, unicode found
というエラーが発生しました。
かなり悩んだ結果
xml_data =srv.getDocumentAsString(query, {})
xml_data = str(xml_data)
と、一旦strをかましてstringに変換してやると
ちゃんと動いてくれました。
よしよし。
この仕組みをPylonsに組み込んでみようと思います。
もどる