IDManagerからKeepassXにデータ移行するxslt

はてな田中さん(@stanaka)がruby製の変換ツール書いてくれました。
独自項目が保存できるのでこちらを利用するのをお勧めします!
https://gist.github.com/3263705

ruby 1.9.2-p290, 1.9.3-p194で使えました。

使い方はこんな感じ。
https://gist.github.com/3282820

sed 's/encoding="shift-jis"/encoding="cp932"/' in.xml  | idm2keepassx.rb >out.xml

以降は「XSLTでやってみたい!」という方向けのエントリ
Linux Desktopで業務を回そう計画の一環として、IDManagerをKeepassXへ移行する予定です。 アプリを変えるためにはデータ移行! ということで、IDManagerでエクスポートしたXMLを、KeepassXでインポートできるXMLに変換するXSLTを書きました。 XSLTヨクワカラナイのでいろいろ参考にさせてもらいました。 特に助かったのはここでした。改行置換はまるっと使わせてもらってます。 ⇒FAQ的なXSLTのサンプル ちゃんとXMLで出力するようにxsl:element使って書いたけど、すごく読みにくく。。 なんちゃってXMLで、HTMLっぽく書いてた時のほうが読みやすかったなぁ。 ※使用上の注意 IDManagerでエクスポートしたXMLのエンコーディング指定を書き換えないとうまく動かない場合があります!

before

<?xml version="1.0" encoding="shift-jis" standalone="yes"?><idmData>

after

<?xml version="1.0" encoding="CP932" standalone="yes"?><idmData>
本体はかなり長いので、つづきに書いておきます。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8" />
<xsl:template match="/">
<xsl:element name="database">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<!-- ignore element -->
<xsl:template match="familyName" />
<xsl:template match="givenName" />
<xsl:template match="familyNamePhonetic" />
<xsl:template match="givenNamePhonetic" />
<xsl:template match="e-mail1" />
<xsl:template match="e-mail2" />
<xsl:template match="e-mail3" />
<xsl:template match="zip1" />
<xsl:template match="prefecture1" />
<xsl:template match="address1" />
<xsl:template match="zip2" />
<xsl:template match="prefecture2" />
<xsl:template match="address2" />
<xsl:template match="tel1" />
<xsl:template match="tel2" />
<xsl:template match="handlename1" />
<xsl:template match="handlename2" />
<xsl:template match="company" />
<xsl:template match="defaultAccountName" />
<xsl:template match="defaultPasswordName" />
<xsl:template match="defaultItem1Name" />
<xsl:template match="defaultItem2Name" />
<xsl:template match="pasteTypeList" />
<xsl:template match="pasteTypeItem" />
<xsl:template match="folder">
<xsl:element name="group">
<xsl:element name="title">
<xsl:value-of select="@name"/>
</xsl:element>
<xsl:element name="icon">48</xsl:element>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="item">
<xsl:element name="entry">
<xsl:element name="title">
<xsl:value-of select="@name"/>
</xsl:element>
<xsl:element name="username">
<xsl:value-of select="account"/>
</xsl:element>
<xsl:element name="password">
<xsl:value-of select="password"/>
</xsl:element>
<xsl:element name="url">
<xsl:value-of select="url"/>
</xsl:element>
<xsl:element name="comment">
<xsl:call-template name="replace-comment">
<xsl:with-param name="str" select="comment"/>
</xsl:call-template>
</xsl:element>
<xsl:element name="icon">18</xsl:element>
<xsl:element name="creation">2009-02-28T00:00:00</xsl:element>
<xsl:element name="lastaccess">2009-02-28T00:00:00</xsl:element>
<xsl:element name="lastmod">2009-02-28T00:00:00</xsl:element>
<xsl:element name="expire">Never</xsl:element>
</xsl:element>
</xsl:template>
<!-- newline replacement function -->
<xsl:template name="replace-comment"><xsl:param name="str"/>
<xsl:choose>
<xsl:when test="contains($str,'&#10;')">
<xsl:value-of select="substring-before($str,'&#10;')"/><br/>
<xsl:call-template name="replace-comment">
<xsl:with-param name="str" select="substring-after($str,'&#10;')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise><xsl:value-of select="$str"/></xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Linux 

See also