O que é um tipo xs: NCName e quando deve ser usado?

97

Executei um dos meus arquivos xml por meio de um gerador de esquema e tudo o que foi gerado foi o esperado, com exceção de um nó:

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

O que exatamente é xs:NCName? E por que alguém iria usá-lo xs:string?

jasso
fonte

Respostas:

92

NCName é um nome não colonizado, por exemplo, "nome". Comparado com QName, que é um nome qualificado, por exemplo, "ns: nome". Se seus nomes não devem ser qualificados por namespaces diferentes, eles são NCNames.

xs: string não impõe nenhuma restrição aos seus nomes, mas xs: NCName basicamente não permite que ":" apareça na string.

Andrey Adamovich
fonte
1
string vazia também não é permitida emxs:NCName
WeizhongTu
108

@skyl praticamente me provocou a escrever esta resposta, por favor, tome cuidado com a redundância.

NCNamesignifica "nome não colonizado". NCName pode ser definido como uma expressão regular do Esquema XML[\i-[:]][\c-[:]]*

... e o que essa regex significa?

\ie \csão escapes de vários caracteres definidos na definição do esquema XML.
http://www.w3.org/TR/xmlschema-2/#dt-ccesN
\i é o escape para o conjunto de caracteres de nome XML iniciais e \cé o conjunto de caracteres de nome XML. [\i-[:]]significa um conjunto que consiste no conjunto, \iexcluindo um conjunto que consiste no caractere de dois pontos :. Portanto, em inglês simples, significaria "qualquer caractere inicial, mas não :". Toda a expressão regular é lida como "Um caractere de nome XML inicial, mas não dois pontos, seguido por zero ou mais caracteres de nome XML, mas não dois pontos."

Restrições práticas de um NCName

As restrições práticas de NCName são de que ele não pode conter vários caracteres de símbolos, como :, @, $, %, &, /, +, ,, ;, espaço em branco caracteres ou parêntese diferente. Além disso, um NCName não pode começar com um número, ponto ou caractere menos, embora possam aparecer mais tarde em um NCName.

Onde são necessários NCNames

Em documentos XML compatíveis com namespace, todos os nomes devem ser nomes qualificados ou NCNames. Os seguintes valores devem ser NCNames (nomes não qualificados):

  • prefixos de namespace
  • valores que representam um ID
  • valores que representam um IDREF
  • valores que representam uma NOTAÇÃO
  • alvos de instrução de processamento
  • nomes de entidades
jasso
fonte
3
A linha 'Além disso, um NCName não pode começar com um número' me ajudou a entender que um número não pode ser um 'xs: ID'
Sean Murphy
Como posso converter essa expressão em uma linguagem de programação como Java ou JS?
Calbertts de
Você pode verificar se é um CName regular com o regex: "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ _] [\\ w \\. \\ - \\ d] *". Que significa. o valor deve começar com uma letra ou sublinhado e, em seguida, conter palavras, pontos, travessões, sublinhados, dígitos. Você pode tentar em: regexr.com
Naxos84
Minha regex fornecida acima só lida com letras latinas. Se desejar a verificação completa de NCNames de acordo com a especificação w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName, você deve usar esta classe: java2s.com/Code/Java/XML/…
Naxos84 de
29

Praticamente falando ...

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

Além disso, -e .não pode ser usado como o primeiro caractere do valor.

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

Izilotti
fonte
2
Acho que estão faltando muitos caracteres permitidos como, por exemplo, é ou ø.
Eric Bloch
Para cobrir esses casos não ASCII, deve incluir \ p {L} + como parte do conjunto de caracteres
Kenston Choi
11
Os dígitos também não podem ser usados ​​como o primeiro caractere.
Thilo
5

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

Sem espaços ou dois pontos. Permite "_" e "-".

Você deve usar isso em vez da string para que possa validar se o valor está limitado ao que é permitido. Ele mapeia bem para certas convenções de nome / identificador como o conceito de "slug" do django, por exemplo.

Eu voto a favor da pessoa que [\i-[:]][\c-[:]]*traduz para o inglês para nós.

Skylar Saveland
fonte
11
Eu adicionei uma resposta que se traduz [\i-[:]][\c-[:]]*em inglês. Vá em frente e
vote positivamente