我知道之前已经问过这些问题,但我仍然没有得到它。
我正在使用.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());
答案 0 :(得分:1)
十进制模式( format-number 的第三个参数)说明哪些字符作为两个分隔符。
第一条指令format-number(@value, '###.###,00', 'european')"/
看起来没问题,因为european
十进制格式将十进制分隔符设置为逗号。
但第二条指令format-number(@value, '###.###,00', 'en')
会导致
错误,因为:
en
十进制格式将小数分隔符设置为点,将第二条指令更改为format-number(@value, '###,###.00', 'en')
(注意两个分隔符都已更改)。
如果错误信息是以这种方式制定的话,也许更容易理解:
#
字符(ddigit占位符,可以更改)
到一个空间),在您的(英语)示例中,您实际上是: