XSLT:如何使用格式数和小数格式?

时间:2017-05-19 09:51:44

标签: c# xml xslt

我知道之前已经问过这些问题,但我仍然没有得到它。

我正在使用.NET进行XSL转换。

MSDN将格式编号描述为:

  

将数字转换为字符串。转换是使用第二个参数(字符串)中指定的格式格式化第一个参数(数字)中指定的数字,并应用以第三个可选参数(字符串)中指定的十进制格式定义的规则的结果。如果省略第三个参数(十进制格式名称),则使用默认的十进制格式。此功能和元素设计为一起使用。

示例

鉴于以下XML,我想设置一个XSLT,将小数公开为欧洲notaton('。'作为小数分隔符,','作为组分隔符)和英语(或标准表示法)。

data.xml中:

<?xml version="1.0" encoding="utf-8" ?>
<Model>
  <Decimal value="1.256"/>
  <Decimal value="19099.33345"/>
</Model>

我使用一个XSLT文档来声明两种十进制格式并在select语句中使用它们,一次用欧洲语言输出,一次用英语表示法输出:

trafo.xslt

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:decimal-format name="european" decimal-separator=',' grouping-separator='.' />
    <xsl:decimal-format name="en" decimal-separator='.' grouping-separator=',' />

  <xsl:template match="/Model">

      <xsl:for-each select="Decimal">
        Auf european: <xsl:value-of select="format-number(@value, '###.###,00', 'european')"/>
        <!--Auf englisch: <xsl:value-of select="format-number(@value, '###.###,00', 'en')"/>-->
      </xsl:for-each>

      </xsl:template>
</xsl:stylesheet>

我的期望是转换将输出如下内容:

european: 1,256
english: 1.256
european: 19.099,33345
english: 19,099.33345

但我得到的例外也提到here

  

“格式”#,###。00'在小数点后的数字符号后面不能有零位符号。“

所以,当我需要更改英文和欧洲符号的格式模式时,十进制格式的目的是什么?

为了完整性,这里是我用于转换的C#代码

        XDocument data = XDocument.Load("data.xml");
        XDocument xslt = XDocument.Load("trafo.xslt");

        XslCompiledTransform compiled = new XslCompiledTransform();
        using (var reader = xslt.CreateReader())
        {
            compiled.Load(reader);
        }

        // wir wollen auch Fragmente zulassen
        var writerSettings = new XmlWriterSettings { ConformanceLevel = ConformanceLevel.Auto };
        var readerSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Auto };
        var stringReader = new StringReader(data.ToString());
        var details = new StringBuilder();
        using (var reader = XmlReader.Create(stringReader, readerSettings))
        {
            using (var writer = XmlWriter.Create(details, writerSettings))
            {
                compiled.Transform(reader, writer);
            }
        }

        Console.WriteLine(details.ToString());

1 个答案:

答案 0 :(得分:1)

十进制模式( format-number 的第三个参数)说明哪些字符作为两个分隔符。

第一条指令format-number(@value, '###.###,00', 'european')"/ 看起来没问题,因为european十进制格式将十进制分隔符设置为逗号。

但第二条指令format-number(@value, '###.###,00', 'en')会导致 错误,因为:

  • en十进制格式将小数分隔符设置为
  • 您在此处指定了逗号

将第二条指令更改为format-number(@value, '###,###.00', 'en') (注意两个分隔符都已更改)。

如果错误信息是以这种方式制定的话,也许更容易理解:

  • 在“传递”char之后将整数部分与小数一部分分开 (在欧洲 - 逗号,英文 - 点),
  • 不允许使用#字符(ddigit占位符,可以更改) 到一个空间),
  • 之后是'0'字符(零位占位符)。

在您的(英语)示例中,您实际上是:

  • 整数部分的3个位置(数字符号),
  • 小数点(点 - 英文版),
  • 小数部分的另外3个位置(也是数字符号), 到目前为止,所有数字都可以更改为空格,
  • 分组分隔符(逗号),
  • 另外2位数字(数字符号),这就是原因 错误信息。
相关问题