Qu'est-ce qu'un type xs: NCName et quand doit-il être utilisé?

97

J'ai exécuté l'un de mes fichiers xml via un générateur de schéma et tout ce qui était généré était ce qui était attendu, à l'exception d'un nœud:

<xs:element name="office" type="xs:NCName"/>

Qu'est-ce que c'est exactement xs:NCName? Et pourquoi l'utiliserait-il plutôt xs:string?

Jasso
la source

Réponses:

92

NCName est un nom non colonisé, par exemple "nom". Comparé à QName qui est un nom qualifié, par exemple "ns: nom". Si vos noms ne sont pas censés être qualifiés par différents espaces de noms, alors ce sont des NCNames.

xs: string ne met aucune restriction sur vos noms, mais xs: NCName interdit fondamentalement ":" d'apparaître dans la chaîne.

Andrey Adamovich
la source
1
La chaîne vide est également interdite dansxs:NCName
WeizhongTu
108

@skyl m'a pratiquement incité à écrire cette réponse, alors faites attention à la redondance.

NCNamesignifie "nom non colonisé". NCName peut être défini comme une expression régulière de schéma XML[\i-[:]][\c-[:]]*

... et que signifie cette expression régulière?

\iet \csont des échappements multi-caractères définis dans la définition de schéma XML.
http://www.w3.org/TR/xmlschema-2/#dt-ccesN
\i est l'échappement de l'ensemble des caractères du nom XML initial et \cest l'ensemble des caractères du nom XML. [\i-[:]]désigne un ensemble composé de l'ensemble à l' \iexclusion d'un ensemble composé du caractère deux-points :. Donc, en anglais simple, cela signifierait "n'importe quel caractère initial, mais pas :". L'expression régulière entière se lit comme suit: «Un caractère de nom XML initial, mais pas de deux-points, suivi de zéro ou plusieurs caractères de nom XML, mais pas de deux-points».

Restrictions pratiques d'un NCName

Les restrictions pratiques de NCName sont qu'il ne peut pas contenir plusieurs caractères de symboles tels que :, @, $, %, &, /, +, ,, ;, les espaces ou caractères différents entre parenthèses. De plus, un NCName ne peut pas commencer par un nombre, un point ou un signe moins bien qu'ils puissent apparaître plus tard dans un NCName.

Où sont nécessaires NCNames

Dans les documents XML conformes aux espaces de noms, tous les noms doivent être des noms qualifiés ou des NCNames. Les valeurs suivantes doivent être NCNames (noms non qualifiés):

  • préfixes d'espace de noms
  • valeurs représentant un identifiant
  • valeurs représentant un IDREF
  • valeurs représentant une NOTATION
  • traitement des cibles d'instructions
  • noms d'entités
Jasso
la source
3
La ligne «De plus, un NCName ne peut pas commencer par un nombre» m'a aidé à comprendre qu'un nombre ne peut pas être un «xs: ID»
Sean Murphy
Comment puis-je convertir cette expression en un langage de programmation comme Java ou JS?
calbertts
Vous pouvez vérifier s'il s'agit d'un CName normal avec l'expression régulière: "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ _] [\\ w \\. \\ - \\ d] *". Cela signifie. la valeur doit commencer par une lettre ou un trait de soulignement, puis contient des mots, des points, des tirets, des traits de soulignement, des chiffres. Vous pouvez l'essayer sur: regexr.com
Naxos84
Mon expression régulière donnée ci-dessus ne gère que les lettres latines. Si vous voulez une vérification complète des NCNames selon la spécification w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName, vous devez utiliser cette classe: java2s.com/Code/Java/XML/…
Naxos84
29

Pratiquement parlant...

Caractères autorisés: - , ., 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, _, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p,q, r, s, t, u, v, w, x, y,z

En outre, -et .ne peut pas être utilisé comme premier caractère de la valeur.

Les caractères non admis: , !, ", #, $, %, &, ', (, ), *, +, ,, /, :, ;, <, =, >, ?, @, [, \, ], ^, `, {, |, },~

Izilotti
la source
2
Je pense qu'il manque beaucoup de caractères autorisés comme, par exemple, é ou ø.
Eric Bloch
Pour couvrir ces cas non-ascii, il devrait inclure \ p {L} + dans le jeu de caractères
Kenston Choi
11
Les chiffres ne peuvent pas non plus être utilisés comme premier caractère.
Thilo
5

http://books.xmlschemata.org/relaxng/ch19-77215.html

Pas d'espaces ni de deux-points. Autorise "_" et "-".

Vous utiliseriez ceci au lieu de string afin de pouvoir valider que la valeur est limitée à ce qui est autorisé. Il correspond bien à certaines conventions pour le nom / identifiant comme le concept de django de "slug", par exemple.

J'apprécie la personne qui [\i-[:]][\c-[:]]*traduit en anglais pour nous.

Skylar Saveland
la source
11
J'ai ajouté une réponse qui se traduit [\i-[:]][\c-[:]]*en anglais. Allez-y et votez, comme vous l'avez promis;)
jasso