Masatoshi Ito の備忘録

旧Blog(goo blog)のアーカイブです。
goo blogの閉鎖に伴い、アーカイブとして移行することにしました。
古い情報やリンク切れなどがあると思いますが、ご了承ください。

ZauCashのxslファイル

(2010年12月02日 22時52分55秒|Zaurus

私は、Zaurusで家計簿を付けるのに、以前はHancomSheetを使用していたのですが、最近(とは言っても半年ぐらい前から)ZauCashを使用させていただいています。
かなり時間が経ってしまっているため、詳しいことを忘れてしまいましたが、PCのFirefoxなどで家計簿のデータのxmlを開くとき、zaucash.xslを用意しておくと見やすく表示させることができます。
その機能を使用して、集計等をできる機能を実現していたのですが、久しぶりにブログのネタ&備忘録として記載しておきます。
以下が私が使用しているzaucash.xslファイルです。

zaucash.xsl
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!-- ルート要素 -->
<xsl:template match="/">
  <html>
  <head>
  <title>ZauCashデータ</title>
  </head>
  <body text="#000000" bgcolor="#ffffff">
    <h1>ZauCashデータ</h1>
    <xsl:apply-templates mode="table"/>
    <p></p>
    <xsl:apply-templates mode="kindof"/>
    <p></p>
    <xsl:apply-templates mode="total"/>
  </body>
  </html>
</xsl:template>

<!-- 一覧表 -->
<xsl:template match="zaucash" mode="table">
  <table border="1" cellpadding="4" cellspacing="0">
  <tr bgcolor="#ccffff">
  <th>日付</th>
  <th><font color="gold">■</font>収入</th>
  <th><font color="blue">■</font>支出</th>
  <th>費目</th>
  <th>メモ</th>
  </tr>
  <xsl:for-each select="record">
    <xsl:sort select="@date" order="ascending"/>
    <tr bgcolor="#ffffcc">
    <td><xsl:value-of select="substring-before(@date,' ')"/></td>
    <xsl:if test="@type='収入'">
      <td align="right">
      <xsl:value-of select="format-number(@money, '###,##0')"/>
      </td>
      <td align="right">-</td>
    </xsl:if>
    <xsl:if test="@type='支出'">
      <td align="right">-</td>
      <td align="right">
      <xsl:value-of select="format-number(@money, '###,##0')"/>
      </td>
    </xsl:if>
    <td><xsl:value-of select="@category"/></td>
    <td><xsl:value-of select="@memo"/></td>
    </tr>
  </xsl:for-each>
  </table>
</xsl:template>

<!-- 項目別 -->
<xsl:template match="zaucash" mode="kindof">
  <table border="1" cellpadding="4" cellspacing="0">
    <tr bgcolor="#ccffff">
      <th>種別</th>
      <th>費目</th>
      <th>合計</th>
    </tr>
    <xsl:for-each select="record">
      <xsl:sort select="@type"/>
      <xsl:sort select="@category"/>
      <xsl:variable name="v1" select="@type" />
      <xsl:variable name="v2" select="@category" />
      <!-- 自分よりも前に同じノードがあった場合は集計済みなので無視 -->
      <xsl:if test="count(preceding-sibling::record[@type=$v1][@category=$v2]) = '0'">
        <!-- 自分よりも後ろにあるノードの集計 -->
        <tr bgcolor="#ffffcc">
          <xsl:if test="@type='収入'">
            <td><font color="gold">■</font><xsl:value-of select="@type"/></td>
          </xsl:if>
          <xsl:if test="@type='支出'">
            <td><font color="blue">■</font><xsl:value-of select="@type"/></td>
          </xsl:if>
          <td><xsl:value-of select="@category"/></td>
          <td align="right"><xsl:value-of select="format-number(sum(following-sibling::record[@type=$v1][@category=$v2]/@money)+@money, '###,##0')"/></td>
        </tr>
      </xsl:if>
    </xsl:for-each>
  </table>
</xsl:template>

<!-- 合計表 -->
<xsl:template match="zaucash" mode="total">
  <xsl:variable name="incomeTotal">
  <xsl:choose>
    <xsl:when test="record/@money[../@type='収入']">
      <xsl:value-of select="sum(record/@money[../@type='収入'])"/>
    </xsl:when>
    <xsl:otherwise>0</xsl:otherwise>
  </xsl:choose>
  </xsl:variable>
  <xsl:variable name="expendTotal">
  <xsl:choose>
    <xsl:when test="record/@money[../@type='支出']">
      <xsl:value-of select="sum(record/@money[../@type='支出'])"/>
    </xsl:when>
    <xsl:otherwise>0</xsl:otherwise>
  </xsl:choose>
  </xsl:variable>

  <table border="1" cellpadding="4" cellspacing="0">
  <tr bgcolor="#ccffff">
  <th><font color="gold">■</font>収入</th>
  <th><font color="blue">■</font>支出</th>
  <th>残金</th>
  </tr>
  <tr bgcolor="#ffffcc">
  <td align="right"><xsl:value-of select="format-number($incomeTotal, '###,##0')"/></td>
  <td align="right"><xsl:value-of select="format-number($expendTotal, '###,##0')"/></td>
  <td align="right"><xsl:value-of select="format-number($incomeTotal - $expendTotal, '###,##0')"/></td>
  </tr>
  </table>
</xsl:template>

</xsl:stylesheet>