0

テキスト フィールドに入力されるかなり大きな整数値を適切な整数値に適切に変換する XSLT マッピングを作成しようとしています。1.234567890E9問題は、1.0 は型番号への変換のみをサポートしているため、次の入力に対して back のような値を取得することです。"1234567890"

XSLT1.0 をコーディング プラットフォームとして Altova MapForce を使用しています。XSLT1.0 のみをサポートする既存のルーチンを使用して XSLT を処理する必要があるため、XSLT2.0 はオプションではないようです。

デフォルトでは Mapforce が生成 <xsl:value-of select="string(floor(number(string(.))))"/> し、考えられるすべての関数の組み合わせを試しましたが、大きな値に対しては常に float を取得します。

さらにテストを行った結果、テキストから int へのマッピング時に number() 関数の使用を主張する Mapforce に問題があることがわかりました。

4

3 に答える 3

2

あなたが尋ねなかった質問に答えることで、これを前進させてみましょう。次の入力があるとします。

XML

<input>
    <value>1234567890000000.9</value>
    <value>9876543210000000</value>
</input>

入力値 (すべて数値ですが、一部は整数ではありません)が出力で整数に変換されるようにしたい場合は、次の変換を適用できます。

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <output>    
        <xsl:for-each select="input/value">
            <value><xsl:value-of select="format-number(., '#')"/></value>
        </xsl:for-each>
    </output>
</xsl:template>  

</xsl:stylesheet>

次の出力を取得します。

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <value>1234567890000001</value>
   <value>9876543210000000</value> 
</output>

ここでの結果は四捨五入ではなく四捨五入されていることに注意してください。

于 2014-04-01T19:07:11.880 に答える
1

mapforce が xslt-2.0 を使用していないことは確かですか?

XSLT-1.0 (saxon または Altova のプロセッサを使用) で行う場合:

<xsl:value-of select="number('1234567890')"/>

私は得る - >1234567890

XSLT-2.0 を使用すると、->1.23456789E9

したがって、XSLT 1 変換が数値の浮動小数点表現を返すと思われるのは非常に奇妙だと思います。

で数値をフォーマットするformat-number(1.23456789E9,'#')と、常に1234567890XSLT-1.0 と 2.0 の両方 が得られます。編集: saxon は 1.23456789E9 を xslt-1.0 の数値に変換しませんが、altova のプロセッサは変換します。

于 2014-04-01T19:14:11.673 に答える
0

問題は Mapforce 内にあるため、mapforce にコードを生成させ、すべての問題を引き起こしているこの 1 つのフィールドを上書きすることにしました。

@Tobias @Michael ご協力ありがとうございます。あなたの助けが答えにつながったので、私はあなたの答えといくつかのコメントの両方を+1しました.

于 2014-04-01T21:27:44.023 に答える