我们有一个请求来实现我们的webservice响应,这样当模式指示时,xsd:decimal小数位数就会被填零。我想知道这是否是一个合理的请求,如果xsd:decimal应该与这些模式一起使用。 以下是xsd根据其规格的相关部分:
<xsd:simpleType>
<xsd:restriction base="xsd:decimal">
<xsd:totalDigits value="14"/>
<xsd:fractionDigits value="2"/>
<xsd:pattern value="[\-+]?[0-9]{1,12}[.][0-9]{2}"/>
</xsd:restriction>
</xsd:simpleType>
因此fractionDigits设置为2,这意味着精度最多可以是2位数。根据{{3}},如果小数位数较少(例如对于像5.1这样的数字),也可以。
但根据模式{2},应始终有2个小数位。
我们正在开发一个通用的应用程序开发平台,并且无法预先知道小数将用于什么(货币,pH值,距离等)。这个案例来自我们平台正在使用的特定项目,但通常我们不知道正在传输什么类型的数据。我们可以决定在这方面遵循WSDL,它声明它应该有2个小数位。但我们对它的实现必须非常通用。
没有什么可以说明这些小数位应该用什么填充,甚至我们应该填充而不是完全忽略这个小数。从理论上讲,我们可以决定用5's填充,直到它匹配模式。据我所知,很少使用模式,如果它们用于密码之类的东西。虽然XSD规范含糊不清,但如果有人能够了解这是否是XSD的有效使用以及我们决定使用0填充是否有意义,我们将不胜感激。
答案 0 :(得分:2)
实际上,我的试金石将是从直接涉及的技术堆栈的角度来看这个,或者更好的是,这是主流。
我可以想到Java上的JAXB或.NET上的xsd / svcutil / etc.exe;使用值1对这个模式片段的这些非常常见的工具进行快速测试将无法生成有效的XML。这将使开发人员争先恐后地进行各种自定义,以使其按照XSD模式工作。痛苦,高昂的开发和维护成本......
同样适用于XSLT;将需要手动格式化输出...底线,XSD模式不是机器可用于“自动”格式化...我还没有看到这样的事情......
我也相信这样的要求是不合理的,我个人认为在描述交换数据时应该将其视为反模式。由于没有绝对的,可以想象必须有例外;我想不出任何一个,但必须探究你被提出这样一个要求的原因;然后我会尝试找到一种不涉及这种模式的解决方案......
答案 1 :(得分:1)
实际上取决于特定小数值的参数..
XML是传输和存储数据的最佳选择,它可以拥有各种数据。我在这里选择两个例子:
数据是货币,我的建议是强制[0-9]*[.][0-9]{2}
..帮助我们的客户数据恢复软件设计为填充0的方式。
数据是化学品的pH值。这里小数点后的一位数是强制性的。 [0-1][0-9][.][0-9]
所以这一切都取决于我们所指的对象。除非它真的有必要强迫模式不公平:)