4

値を特定の形式にフォーマットする必要がありますが、サポートされているようには見えません。

使いたい:

format-number($value, '####,##,##,##0')

しかし、これを試したときに返される値は'###,###,##0'

したがって$value = '123456789'、値を次のように出力したい場合は、1,24,56,789を取得してい123,456,789ます。

できるフォーマットに制限はありますか?

W3schoolsにアクセスして、次の xml を入力すると:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<catalog>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>123456789</price>
        <year>1985</year>
    </cd>
    <cd>
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
        <country>UK</country>
        <company>CBS Records</company>
        <price>123456789</price>
        <year>1988</year>
    </cd>

</catalog>

そして、次の xsl:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<xsl:variable name="TestFormat" select="'###,##,##,##0'"/>
  <html>
  <body>
  <h2>My CD Collection</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Title</th>
        <th>Artist</th>
      </tr>
      <xsl:for-each select="catalog/cd">
      <tr>
        <td><xsl:value-of select="title"/></td>
        <td><xsl:value-of select="format-number(price, $TestFormat)"/></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

目的のフォーマットが得られていないことがわかります。助言がありますか?

助けてくれてありがとう。

4

3 に答える 3

1

8文字と9文字の文字列の場合、次のように機能します。

      <td>
        <xsl:value-of select="substring(price,1,1)"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="substring(price,2,1)"/>
        <xsl:value-of select="substring(price,4,1)"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="substring(price,5,2)"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="substring(price,7,3)"/>
        <xsl:if test="string-length(price) &lt; 9">
          <xsl:value-of select="0"/>
        </xsl:if>
      </td>

意図によっては、わずかに異なるフォーマットを実現するために、「if」ブロックを移動または変更する必要がある場合があります。

于 2012-07-24T13:10:29.547 に答える
1

グループ区切り記号,は、小数点記号の直後から最初に出現した場合にのみ考慮されます。これは、フォーマット パターン文字列が JDK 1.1 DecimalFormat クラスで指定された構文であるとW3C が指定しているためです。そのクラスを見ると、整数のグループ化サイズ プロパティがあることがわかります。そのため、フォーマット全体の可変グループ サイズをそのクラスでモデル化することはできません。

したがって、 を記述する場合、グループ化サイズは 3 (右端のグループ化セパレータとフォーマット文字列の末尾の###,##,##,##0間の桁数) に設定され、を記述する場合、各桁の間にグループ化セパレータが配置されます。,###,##,##,0

外部の書式設定ツール/関数を使用せずに XSLT でこれを実行したい場合は、関数と関数を使用しstring-length、グループ セパレータを手動で挿入することで、おそらく何かを作成できます。concatsubstring

更新:これらのステートメントは、XSLT 1.0 に対してのみ有効です。

于 2012-07-24T12:46:44.540 に答える
1

XSLT 2.0 に移行するときが来ました。Saxon の現在のリリースでは、コードは次の出力を生成します。

<html>
   <body>
      <h2>My CD Collection</h2>
      <table border="1">
         <tr bgcolor="#9acd32">
            <th>Title</th>
            <th>Artist</th>
         </tr>
         <tr>
            <td>Empire Burlesque</td>
            <td>12,34,56,789</td>
         </tr>
         <tr>
            <td>Hide your heart</td>
            <td>12,34,56,789</td>
         </tr>
      </table>
   </body>
</html>
于 2012-07-24T21:21:06.893 に答える