- PR -

xsltの変換

1
投稿者投稿内容
こまこま
会議室デビュー日: 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の哀しいところですね
1

スキルアップ/キャリアアップ(JOB@IT)