: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に属性が付いていてそれを維持する場合は、以下の記述が必要。 直後に。
..
.. ::
..
..
..
..
..