- こまこま
- 会議室デビュー日: 2006/04/19
- 投稿数: 1
|
投稿日時: 2006-04-19 18:40
<.... form="%5.2f">のようなXMLデータを変換して結果”00.00”と出力するプログラムを考えてます。
<説明>
"%5.2f"は小数点込みで五桁、小数点以下2桁という意味です。
このように変換できるxsltはありますでしょうか。ご意見よろしくおねがいします。
|
- MMX
- ぬし
- 会議室デビュー日: 2001/10/26
- 投稿数: 861
|
投稿日時: 2006-04-21 00:59
form → (フォーマットパターン文字列は、JDK 1.1 の DecimalFormat)
の文字列をxsl変数にとり、それを
関数: string format-number(number, string, string?)
の第二引数に指定する。
12.3 数字のフォーマット
http://www.infoteria.com/jp/contents/xml-data/REC-xslt-19991116-jpn.htm#format-number
かな
|
- MMX
- ぬし
- 会議室デビュー日: 2001/10/26
- 投稿数: 861
|
投稿日時: 2006-04-24 09:26
>"%5.2f"→変換後00.00とすべて0に変換するみたいな関数がありましたら
2段の処理をまとめたのはありません
1.部分文字列の切り出し
2.文字列→数値変換
3.繰り返し文字列発生
ーーーーーーーーーーーーーー
スクリプト言語のような、テキスト処理の「至れり尽くせり」を xsltの
仕組みに期待してはいけません。そう言う生い立ちです。
xslt1.0は出力フォーマット直前の軽い変形のために 設計されました。
濃い処理を書くと行数 膨れ上がります。
[ メッセージ編集済み 編集者: MMX 編集日時 2006-04-24 09:44 ]
|
- 未記入
- 会議室デビュー日: 2005/02/22
- 投稿数: 15
|
投稿日時: 2006-05-30 15:57
こんにちは。
入力が
<x form="%5.2f">123</x>
のような場合、下記のようになるのではないでしょうか。
コード: |
|
<xsl:template match="x">
<xsl:call-template name="get_fraction">
<xsl:with-param name="v" select="."/>
<xsl:with-param name="f" select="@form"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="get_fraction">
<xsl:param name="v"/>
<xsl:param name="f"/>
<xsl:variable name="i" select="substring-before(substring-after($f, '%'), '.')"/>
<xsl:variable name="d" select="substring-before(substring-after($f, '.'), 'f')"/>
<xsl:variable name="int">
<xsl:call-template name="get_digit">
<xsl:with-param name="n" select="$i - $d - 1"/>
<xsl:with-param name="c" select="0"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="dec">
<xsl:call-template name="get_digit">
<xsl:with-param name="n" select="$d"/>
<xsl:with-param name="c" select="0"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="frm">
<xsl:value-of select="concat($int, '.', $dec)"/>
</xsl:variable>
<xsl:value-of select="format-number($v, $frm)"/>
</xsl:template>
<xsl:template name="get_digit">
<xsl:param name="n" select="0"/>
<xsl:param name="s"/>
<xsl:param name="c"/>
<xsl:choose>
<xsl:when test="$n = 0">
<xsl:value-of select="$s"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="get_digit">
<xsl:with-param name="n" select="$n - 1"/>
<xsl:with-param name="s" select="concat($s, $c)"/>
<xsl:with-param name="c" select="$c"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
|
|
- MMX
- ぬし
- 会議室デビュー日: 2001/10/26
- 投稿数: 861
|
投稿日時: 2006-05-30 17:01
<xsl:call-template name="get_digit">
はダミー列から取る方式で短縮できます。
substring("12345",2,3) は "234" を返す。
substring("000000000000",1,$i - $d - 1)
とか
文字列操作パズルで押すのなら
substring("000000000.000000000",11-$i+$d,$i)
かな、保守しやすさによりますが。
=================
パターンの数が少ないなら、九九の表 のように 列挙対応で書式文字列 発生
でもできます。XSLTパズルで頭脳をすり減らすのは良くない。
[ メッセージ編集済み 編集者: MMX 編集日時 2006-05-31 00:44 ]
|
- 未記入
- 会議室デビュー日: 2005/02/22
- 投稿数: 15
|
投稿日時: 2006-05-31 08:47
引用: |
|
XSLTパズルで頭脳をすり減らすのは良くない。
|
単なる再帰を書いただけでも、パズルに見えてしまうのが、XSLTの哀しいところですね
|