如何在XSLT中使用十进制格式

时间:2015-02-03 09:56:16

标签: xslt

我有传入的xml文件,其中数字格式可能因创建者的区域设置而异。 我发现<xsl:decimal-format>应该照顾这个,但没有成功。

输入示例:

<?xml version="1.0" encoding="UTF-8"?><Network>
  <DataFrames>
      <DataFrame bitSize="11,111" name="Fiiil" offset="11.1112" period="11.1112" priority="0">
          <Path name="Fiiil-h28" parent="Fiiil">
              <Node name="h28" sequenceNumber="1" parent="Fiiil-h28"/>
          </Path>
      </DataFrame>
  </DataFrames>
</Network>

我的xsl

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

<!-- Copy all nodes (that do not get a better match) unchanged -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="DataFrame">
    <xsl:variable name="framename" select="@name"/>
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:apply-templates select="//Path[@parent=$framename]">
            <xsl:sort select="@name" data-type="text" />
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

<xsl:template match="Path">
    <xsl:variable name="pathname" select="@name"/>
    <xsl:copy>
        <xsl:apply-templates select="@*[not(name()='parent')]"/>
        <xsl:apply-templates select="//Node[@parent=$pathname]">
            <xsl:sort select="@sequenceNumber" data-type="text" />
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

我已经读过,不为十进制格式指定名称会使其成为默认值。将group-separator作为空字符串会导致StringIndexOutOfBoundsException,但即使我为group-separator指定了一个字符,数字属性(bitsize,offset,period)也不会受到影响。

2 个答案:

答案 0 :(得分:0)

输入文档中XSLT和XPath 1.0中的数字被解析为双精度浮点数http://www.w3.org/TR/xpath/#numbers,并且使用xsl:decimal-format对它没有任何影响,因为它仅用于定义格式使用format-number的输出格式。

因此,使用xsl:decimal-format更改数字解析的任何方法都不会起作用。我不确定你想要实现什么,如果你的数字值不是引用的数字格式,并且想要将它们解析为数字,你需要确保首先使用字符串函数将它们转换为正确的格式,例如translate('3,1415926', ',', '.')

您发布的XSLT代码不会解析任何数字,也不会格式化任何数字。如果您取出<xsl:decimal-format decimal-separator="." grouping-separator=""/>,它只会将节点值作为字符串处理。我担心“无论输入具有哪种数字格式”都是相当广泛和模糊的,正如我已经说过的,将值解析为数字XSLT和XPath 1.0仅支持http://www.w3.org/TR/xpath/#numbers格式而没有分组分隔符,带小数将.作为小数点分隔符。除非首先进行转换,否则不能将任何不同的内容解析为数字,并且在XSLT 1.0中,只有translate之类的字符串函数可以进行任何转换。

答案 1 :(得分:0)

XSLT无法解析以本地化格式出现在XML中的数字。你必须自己编写这样的函数。如果您使用XSLT 2.0(您可以使用正则表达式将数字转换为标准XSD格式),将会轻松得多。

当您使用XML进行应用程序之间的数据交换时,一般建议是使用标准(非本地化)格式在应用程序之间进行通信;本地化应该在呈现给人类用户之前的最后可能时刻完成。但是这个建议可能对你来说太迟了。