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

分组分隔符,仅在小数分隔符后第一次出现时才受到尊重。这是因为W3C 指定格式模式字符串采用 JDK 1.1 DecimalFormat 类指定的语法。 查看该类会发现它具有整数分组大小属性,因此整个格式中的可变组大小无法由该类建模。

因此,在编写时###,##,##,##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 回答