:date: 2010-10-17 19:39:30 :tags: python ====================================================== 別解: lxmlを使ってXMLの要素をソートして返す ====================================================== はじめに --------- こんにちは、NERDです。先日、 `lxmlを使ってXMLの要素をソートして返す - YAMAGUCHI::weblog`_ というエントリが上がっていたので、XMLの変換と言えばxsltでしょう!とか思ったので実際にやってみました。xsltの適用は元記事の方でも使っているlxmlで簡単にできるのが良いですね。 .. _`lxmlを使ってXMLの要素をソートして返す - YAMAGUCHI::weblog`: http://d.hatena.ne.jp/ymotongpoo/20101008/1286499332 参考 ----- * `lxml.etree._Element`_ * `たのしいXML: XSLT基礎編: xsl:sort`_ .. _`lxml.etree._Element`: http://codespeak.net/lxml/api/lxml.etree._Element-class.html .. _`たのしいXML: XSLT基礎編: xsl:sort`: http://www6.airnet.ne.jp/manyo/xml/ サンプルコード --------------- .. code-block:: python # -*- coding: utf-8 -*- from lxml import etree xml = """ 5 spam 1 egg 100 ham 2 bacon """ xslt = """ """ def sort_by_id(xml): try: tree = etree.fromstring(xml) transform = etree.XSLT(etree.fromstring(xslt)) transformed = transform(tree) return etree.tostring(transformed, pretty_print=True) except Exception, e: """ rescure here. """ raise e if __name__ == '__main__': print xml print '--------------------' print sort_by_id(xml) xsltの記述、けっこう長くなってしまってますね。もうちょっと短く書ける気がするんですが…。あと出来るだけタグ名に依存しないように書ければいいなあ。 実行結果 --------- .. code-block:: xml 5 spam 1 egg 100 ham 2 bacon -------------------- 1 egg 2 bacon 5 spam 100 ham .. :extend type: text/x-rst .. :extend: .. :comments: .. :comment id: 2010-10-21.4151359945 .. :title: Re:別解: lxmlを使ってXMLの要素をソートして返す .. :author: ymotongpoo .. :date: 2010-10-21 18:13:36 .. :email: .. :url: http://d.hatena.ne.jp/ymotongpoo/20101008/1286499332 .. :body: .. XSLTを使うのは逆に僕がやりたかったことなのでとても助かります!!ありがとうございます!! .. .. :comments: .. :comment id: 2010-10-21.0959510319 .. :title: Re:別解: lxmlを使ってXMLの要素をソートして返す .. :author: しみずかわ .. :date: 2010-10-21 21:31:08 .. :email: .. :url: .. :body: .. statusesに属性が付いていてそれを維持する場合は、以下の記述が必要。 直後に。 .. .. :: .. .. .. .. ..