ChatGPT解决这个技术问题 Extra ChatGPT

XSD:xs:integer 和 xs:int 有什么区别?

xsd

我已经开始创建 XSD,并在 xs:integerxs:int 的几个示例中找到。

xs:integerxs:int 有什么区别?什么时候应该使用 xs:integer?什么时候应该使用 xs:int


P
Peter Rader

区别如下: xs:int 是带符号的 32 位整数。 xs:integer 是一个整数无界值。有关详细信息,请参阅 https://web.archive.org/web/20151117073716/http://www.w3schools.com/schema/schema_dtypes_numeric.asp 例如,XJC (Java) 为 xs:int 生成 Integer,为 xs:integer 生成 BigInteger

底线:如果您想跨平台工作,请使用 xs:int,并确保您的号码顺利通过。如果您想要更大的数字 – 使用 xs:long 而不是 xs:integer(它将生成到 Long)。


Saxon 9 HE(家庭版)仅支持 'xs:integer, but not xs:int` 或 xs:long
w3cshools 不具有权威性。为什么不参考正确的定义?例如,w3.org/2001/XMLSchema.xsd 表示整数绑定到 +/-9223372036854775808。此外,跨平台与(兼容的)xml 无关。
@Nishi,听起来像 Saxon 9 HE 不符合要求。阅读 saxon.sourceforge.net 页面,似乎只有 EE 版本符合要求。
@PaulHargreaves,Saxon 9 HE 是(据我所知)完全符合的 XSLT 处理器:xs:int 不在基本 XSLT 处理器 required to support 的类型集中。如果您的意思是它不是一个符合标准的 XSD 处理器,这是正确的但具有误导性:它根本不是一个 XSD 处理器。
@PaulHargreaves,您关于 +/-9223372036854775808 是“xs:integer”最大值的评论是错误的:XMLSchema.xsd 定义“xs:long”是“xs:integer”限制为 +/-9223372036854775808
C
C. M. Sperberg-McQueen

xs:integer 类型是 xs:decimal 的限制,fractionDigits facet 设置为零,词法空间禁止小数点和尾随零,否则是合法的。它没有最小值或最大值,尽管在有限大小的机器中运行的实现不需要能够接受任意大或小的值。 (它们需要支持 16 位十进制数字的值。)

xs:int 类型是 xs:long 的限制,maxInclusive facet 设置为 2147483647,minInclusive facet 设置为 -2147483648。 (如您所见,它可以方便地放入两个补码的 32 位有符号整数字段;xs:long 适合 64 位有符号整数字段。)

通常的规则是:使用与您想说的话相匹配的那个。如果对元素或属性的约束是其值必须是整数,则 xs:integer 会简洁地说明这一点。如果约束条件是该值必须是一个整数,并且可以以二进制补码表示形式用最多 32 位表示,请使用 xs:int。 (一个次要但有时重要的问题是,您的工具链与一个工具链一起工作是否比另一个更好。对于比您的工具链寿命更长的数据,首先听取数据是明智的;对于仅用于提供工具的数据链,如果你改变你的工具链,这将是没有意义的,没有理由不听工具链。)


你:在有限大小的机器上运行的实现不需要[...]标准是否要求在无限机器(如图灵机和其他东西)上运行的实现应该接受并正确代表整个范围? :-) 那会很酷,因为按照目前已知的物理定律,宇宙不允许这样的机器。
不,specification 对在无限机器上运行的实现没有特殊规则;所有实现都可以从管理无限数据类型的部分实现的规则中受益。
P
PeteCahill

我只想添加一个对某些人可能很重要的迂腐注释:说 xs:int “是”一个有符号的 32 位整数是不正确的。这种形式的词意味着在二进制数字计算机的内存(或寄存器等)中实现。 XML 是基于字符的,并且会将最大 32 位有符号值实现为“2147483647”(当然是我的引号),这比 32 位要多得多!正确的是 xs:int 是(间接地)对 xs:integer 的限制,它将最大和最小允许值设置为与带有符号位的 32 位整数的相应实现强加限制相同。


无法保证使用 XSD 验证的源信息集以字符序列的形式出现;如果该模式用于验证通过 XSLT 或 XQuery 构造的文档实例,则很可能使用 32 位整数的常规表示法在内存中表示 xs:int 值。
@CMSperberg-McQueen,我不确定我是否理解您的观点。 xs:int 是一个具有范围的类型,它的存储方式与 XSD 无关,并且任何将“int”硬编码为内存中的 32 位有符号整数的任何东西都会出现问题,例如,如果选择了一个不同的 XSD 说int 的范围与 w3c XSD 中定义的范围不同。
@PaulHargreaves 这是一个有点迂腐的观点(本着答案的精神)。答案是正确的,直截了当地说 xs:int 是有符号的 32 位二进制补码整数是不正确的。但是答案也说,由于XML是基于字符的,所以xs:int的最大值是字符串“2147483647”;最后一点不一定是这样。许多系统都使用 XSD 类型,例如 XQuery 数据库,其中 xs:int 值更可能在 32 位二进制补码字段中表示,而不是 Unicode 字符串。
用“代表”代替“是”

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅