xml - simple - xsd schema
¿Qué es un tipo xs: NCName y cuándo debería usarse? (4)
Ejecuté uno de mis archivos xml a través de un generador de esquemas y todo lo que 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é uno lo usaría, en lugar de xs:string ?
@skyl prácticamente me provocó a escribir esta respuesta, por favor, tenga en cuenta la redundancia.
NCName significa "nombre no colonizado". NCName se puede definir como una expresión regular de esquema XML [/i-[:]][/c-[:]]*
... y qué significa esa expresión regular?
/i y /c son escapes de múltiples 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 inicial y /c es el conjunto de caracteres de nombre XML. [/i-[:]] significa un conjunto que consiste en el conjunto /i excluyendo un conjunto que consta del carácter de dos puntos : Así que en inglés simple significaría "cualquier carácter inicial, pero no : ". Toda la expresión regular 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 símbolos como : @ , $ , % , & , / , + ; , espacios en blanco o diferentes paréntesis. Además, un NCName no puede comenzar con un número, punto o carácter negativo, aunque pueden aparecer más adelante en un NCName.
Dónde se necesitan NCNames
En documentos XML conformes con el espacio de nombres, todos los nombres deben ser nombres calificados o NCNames. Los siguientes valores deben ser NCNames (nombres no calificados):
- prefijos del espacio de nombres
- valores que representan una identificación
- valores que representan un IDREF
- valores que representan una NOTACIÓN
- objetivos de instrucción de procesamiento
- nombres de entidades
Hablando practicamente...
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 usar como el primer caracter del valor.
Caracteres no permitidos: , ! , " , # , $ , % , & , '' , ( , ) , * , + / , : , ; , < , = , > , ? , @ , [ , / , ] , ^ , ` , { , | , } , ~
http://books.xmlschemata.org/relaxng/ch19-77215.html
Sin espacios ni dos puntos Permite "_" y "-".
Debería usar esto en lugar de cadena para que pueda validar que el valor está limitado a lo permitido. Se correlaciona bien con ciertas convenciones de nombre / identificador como el concepto de django de "slug", por ejemplo.
Renuncié a la persona que [/i-[:]][/c-[:]]* traduce al inglés para nosotros.
NCName es un nombre no colonizado, por ejemplo, "nombre". Comparado con QName, que es nombre calificado, por ejemplo, "ns: nombre". Si se supone que sus nombres no están calificados por espacios de nombres diferentes, entonces son NCNames.
xs: string no pone restricciones en absoluto a sus nombres, pero xs: NCName básicamente no permite que ":" aparezca en la cadena.