¿Qué es un tipo xs: NCName y cuándo debería usarse?

97

Ejecuté uno de mis archivos xml a través de un generador de esquemas y todo lo que se generó fue lo que se esperaba, con la excepción de un nodo:

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

¿Qué es exactamente xs:NCName? ¿Y por qué lo usaría uno, más bien xs:string?

Jasso
fuente

Respuestas:

92

NCName es un nombre no colonizado, por ejemplo, "nombre". Comparado con QName, que es un nombre calificado, por ejemplo, "ns: nombre". Si se supone que sus nombres no deben estar calificados por diferentes espacios de nombres, entonces son NCNames.

xs: string no impone ninguna restricción a sus nombres, pero xs: NCName básicamente no permite que ":" aparezca en la cadena.

Andrey Adamovich
fuente
1
La cadena vacía también está prohibida enxs:NCName
WeizhongTu
108

@skyl prácticamente me provocó a escribir esta respuesta, así que ten cuidado con la redundancia.

NCNamesignifica "nombre no colonizado". NCName se puede definir como una expresión regular de esquema XML[\i-[:]][\c-[:]]*

... y ¿qué significa esa expresión regular?

\iy \cson escapes de varios caracteres definidos en la definición del esquema XML.
http://www.w3.org/TR/xmlschema-2/#dt-ccesN
\i es el escape para el conjunto de caracteres de nombre XML iniciales y \ces el conjunto de caracteres de nombre XML. [\i-[:]]significa un conjunto que consta del conjunto \iexcluyendo un conjunto que consta del carácter de dos puntos :. Entonces, en inglés simple significaría "cualquier carácter inicial, pero no :". La expresión regular completa se lee como "Un carácter de nombre XML inicial, pero no dos puntos, seguido de cero o más caracteres de nombre XML, pero no dos puntos".

Restricciones prácticas de un NCName

Las restricciones prácticas de NCName son que no puede contener varios caracteres de símbolos como :, @, $, %, &, /, +, ,, ;, espacio en blanco o caracteres diferentes entre paréntesis. Además, un NCName no puede comenzar con un número, un punto o un carácter menos, aunque pueden aparecer más tarde en un NCName.

¿Dónde se necesitan NCNames?

En documentos XML compatibles con el espacio de nombres, todos los nombres deben ser nombres calificados o NCNames. Los siguientes valores deben ser NCNames (no nombres calificados):

  • prefijos de espacio de nombres
  • valores que representan un ID
  • valores que representan un IDREF
  • valores que representan una NOTACIÓN
  • procesamiento de objetivos de instrucción
  • nombres de entidades
Jasso
fuente
3
La línea 'Además, un NCName no puede comenzar con un número' me ayudó a entender que un número no puede ser una 'xs: ID'
Sean Murphy
¿Cómo puedo convertir esa expresión a un lenguaje de programación como Java o JS?
calbertts
Puede comprobar si es un CName normal con la expresión regular: "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ _] [\\ w \\. \\ - \\ d] *". Eso significa. el valor debe comenzar con una letra o un guión bajo y luego contener palabras, puntos, guiones, guiones bajos, dígitos. Puede probarlo en: regexr.com
Naxos84
Mi expresión regular dada arriba solo maneja letras latinas. Si desea la verificación completa de NCNames de acuerdo con la especificación w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName , debe usar esta clase: java2s.com/Code/Java/XML/…
Naxos84
29

Hablando practicamente...

Los caracteres permitidos: - , ., 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

Además, -y .no se puede utilizar como primer carácter del valor.

Caracteres no permitidos: , !, ", #, $, %, &, ', (, ), *, +, ,, /, :, ;, <, =, >, ?, @, [, \, ], ^, `, {, |, },~

izilotti
fuente
2
Creo que a esto le faltan muchos caracteres permitidos como, por ejemplo, é o ø.
Eric Bloch
Para cubrir esos casos no ascii, debe incluir \ p {L} + como parte del conjunto de caracteres
Kenston Choi
11
Los dígitos tampoco se pueden utilizar como primer carácter.
Thilo
5

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

Sin espacios ni dos puntos. Permite "_" y "-".

Usaría esto en lugar de una cadena para poder validar que el valor está limitado a lo permitido. Se asigna bien a ciertas convenciones para el nombre / identificador como el concepto de "slug" de django, por ejemplo.

Voto a la persona que [\i-[:]][\c-[:]]*traduce al inglés para nosotros.

Skylar Saveland
fuente
11
Agregué una respuesta que se traduce [\i-[:]][\c-[:]]*al inglés. Continúe y vote, como prometió;)
jasso