XSLT格式编号函数未格式化



我需要将值格式化为特定的格式,但它似乎不受支持。

我想使用:

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>

你可以看到我没有得到想要的格式。有什么建议吗?

提前感谢您的帮助。

对于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"块以实现略有不同的格式。

现在是时候转向XSLT2.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>

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

因此,当写入###,##,##,##0时,分组大小被设置为三(最右边的分组分隔符,和格式字符串末尾之间的位数,而当写入###,##,##,0时,每个数字之间将有一个分组分隔符。

如果真的、真的想在没有任何外部格式化工具/函数的情况下在XSLT中实现这一点,那么您可能可以使用string-lengthconcatsubstring函数并手动插入组分隔符。

更新:这些语句仅对XSLT1.0有效。

最新更新