XSD: Was ist der Unterschied zwischen xs: integer und xs: int?

111

Ich habe begonnen, XSD zu erstellen und in einigen Beispielen für xs:integerund gefunden xs:int.

Was ist der Unterschied zwischen xs:integerund xs:int? Wann sollte ich verwenden xs:integer? Wann sollte ich verwenden xs:int?

Michael
quelle

Antworten:

110

Der Unterschied ist folgender: xs:intist eine vorzeichenbehaftete 32-Bit-Ganzzahl. xs:integerist ein ganzzahliger unbegrenzter Wert. Weitere Informationen finden Sie unter https://web.archive.org/web/20151117073716/http://www.w3schools.com/schema/schema_dtypes_numeric.asp . Beispielsweise generiert XJC (Java) Integerfür xs:intund BigIntegerfür xs:integer.

Fazit: Verwenden xs:intSie diese Option, wenn Sie plattformübergreifend arbeiten möchten und sicherstellen möchten, dass Ihre Nummern problemlos weitergegeben werden. Wenn Sie größere Zahlen möchten, verwenden Sie xs:longanstelle von xs:integer(es wird generiert, um Long).

Michael
quelle
2
Saxon 9 HE (Home Edition) unterstützt nur 'xs: integer , but not xs: int` oder xs:long.
Nishi
13
w3cshools ist nicht maßgebend. Warum nicht auf die richtigen Definitionen verweisen? w3.org/2001/XMLSchema.xsd gibt an, dass die Ganzzahl beispielsweise an +/- 9223372036854775808 gebunden ist. Plattformübergreifend hat auch nichts mit der (kompatiblen) XML zu tun.
Paul Hargreaves
@Nishi, klingt wie Saxon 9 HE ist nicht konform. Beim Lesen der Seite saxon.sourceforge.net scheint nur die EE-Version konform zu sein.
Paul Hargreaves
2
@PaulHargreaves, Saxon 9 HE ist (soweit ich weiß) ein vollständig konformer XSLT-Prozessor: xs: int gehört nicht zu den Typen, die ein grundlegender XSLT-Prozessor unterstützen muss . Wenn Sie meinen, es ist kein konformer XSD-Prozessor, ist dies wahr, aber irreführend: Es ist überhaupt kein XSD-Prozessor.
CM Sperberg-McQueen
8
@PaulHargreaves, Ihr Kommentar zu +/- 9223372036854775808 als Maximum von "xs: integer" ist falsch: XMLSchema.xsd definiert, dass "xs: long" eine Einschränkung von "xs: integer" auf +/- 9223372036854775808
metatechbe ist
30

Der Integer- Typ xs: ist eine Einschränkung von xs: decimal, wobei die Facette fraktionDigits auf Null gesetzt ist und ein lexikalisches Leerzeichen den Dezimalpunkt und nachfolgende Nullen verbietet, die ansonsten zulässig wären. Es gibt keinen minimalen oder maximalen Wert, obwohl Implementierungen, die auf Maschinen endlicher Größe ausgeführt werden, nicht erforderlich sind, um beliebig große oder kleine Werte akzeptieren zu können. (Sie müssen Werte mit 16 Dezimalstellen unterstützen.)

Der Typ xs: int ist eine Einschränkung von xs: long, wobei die maxInclusive-Facette auf 2147483647 und die minInclusive-Facette auf -2147483648 festgelegt ist. (Wie Sie sehen können, passt es bequem in ein 32-Bit-Ganzzahlfeld mit zwei Komplementen und zwei Komplementen. Xs: long passt in ein 64-Bit-Ganzzahlfeld mit Vorzeichen.)

Die übliche Regel lautet: Verwenden Sie die Regel, die Ihren Vorstellungen entspricht. Wenn die Einschränkung für ein Element oder Attribut darin besteht, dass sein Wert eine Ganzzahl sein muss, sagt xs: integer dies kurz und bündig aus. Wenn die Einschränkung darin besteht, dass der Wert eine Ganzzahl sein muss, die mit höchstens 32 Bit in einer Zweierkomplementdarstellung ausgedrückt werden kann, verwenden Sie xs: int. (Ein sekundäres, aber manchmal wichtiges Problem ist, ob Ihre Werkzeugkette mit der einen besser funktioniert als mit der anderen. Bei Daten, die länger als Ihre Werkzeugkette leben, ist es ratsam, zuerst die Daten anzuhören, bei Daten, die nur zum Zuführen des Werkzeugs vorhanden sind Kette, und was für Sie nicht von Interesse ist, wenn Sie Ihre Werkzeugkette ändern, gibt es keinen Grund, nicht auf die Werkzeugkette zu hören.)

CM Sperberg-McQueen
quelle
Sie: Implementierungen, die auf Maschinen endlicher Größe ausgeführt werden, müssen nicht [...] den Standard vorschreiben, dass Implementierungen, die auf unendlichen Maschinen (wie Turing-Maschinen und anderen Geräten) ausgeführt werden, den gesamten Bereich akzeptieren und ordnungsgemäß darstellen müssen? :-) Das wäre cool, denn das Universum mit den Gesetzen der Physik, wie sie derzeit bekannt sind, lässt solche Maschinen nicht zu.
Jeppe Stig Nielsen
Nein, die Spezifikation enthält keine speziellen Regeln für Implementierungen, die auf unendlichen Computern ausgeführt werden. Alle Implementierungen dürfen von den Regeln für die teilweise Implementierung der unendlichen Datentypen profitieren.
CM Sperberg-McQueen
6

Ich möchte nur einen Hinweis auf Pedanterie hinzufügen, der für manche Menschen wichtig sein kann: Es ist nicht richtig zu sagen, dass xs: int eine vorzeichenbehaftete 32-Bit-Ganzzahl ist. Diese Form von Wörtern impliziert eine Implementierung im Speicher (oder in Registern usw.) innerhalb eines binären digitalen Computers. XML ist zeichenbasiert und würde den maximalen vorzeichenbehafteten 32-Bit-Wert als "2147483647" implementieren (meine Anführungszeichen natürlich), was viel mehr als 32 Bit ist! Was wahr ist, ist, dass xs: int (indirekt) eine Einschränkung von xs: integer ist, die die maximal und minimal zulässigen Werte so festlegt, dass sie den entsprechenden durch die Implementierung auferlegten Grenzen einer 32-Bit-Ganzzahl mit einem Vorzeichenbit entsprechen.

PeteCahill
quelle
Es gibt keine Garantie dafür, dass das mit XSD validierte Quell-Infoset in Form einer Zeichenfolge vorliegt. Wenn das Schema zum Validieren einer mit XSLT oder XQuery erstellten Dokumentinstanz verwendet wird, besteht jede Möglichkeit, dass ein xs: int-Wert unter Verwendung der herkömmlichen Darstellung für 32-Bit-Ganzzahlen im Speicher dargestellt wird.
CM Sperberg-McQueen
@ CMSperberg-McQueen, ich bin nicht sicher, ob ich Ihren Punkt verstehe. xs: int ist ein Typ mit einem Bereich, dessen Speicherung für die XSD irrelevant ist, und alles, was "int" als 32-Bit-Ganzzahl mit Vorzeichen im Speicher fest codiert, führt zu Problemen, wenn beispielsweise eine andere XSD ausgewählt wird, die besagt Ein int hat einen anderen Bereich als den in der w3c XSD definierten Bereich.
Paul Hargreaves
1
@PaulHargreaves ist ein etwas pedantischer Punkt (im Geiste der Antwort). Die Antwort ist richtig , dass es nicht richtig ist flach zu sagen , dass xs: int ist eine 32-Bit - Zweier-Komplement Ganzzahl. Die Antwort besagt jedoch auch, dass der Maximalwert von xs: int die Zeichenfolge "2147483647" ist, da XML zeichenbasiert ist. das letzte bisschen ist nicht unbedingt so. XSD-Typen werden von vielen Systemen verwendet, z. B. XQuery-Datenbanken, bei denen ein xs: int-Wert eher in einem 32-Bit-Zweierkomplementfeld als als eine Folge von Unicode-Zeichen dargestellt wird.
CM Sperberg-McQueen
Verwenden Sie "steht" anstelle von "ist"
Chris Walsh