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に組み込んでみようと思います。



もどる