Co to jest typ xs: NCName i kiedy należy go używać?

97

Uruchomiłem jeden z moich plików xml przez generator schematów i wszystko, co zostało wygenerowane, było zgodne z oczekiwaniami, z wyjątkiem jednego węzła:

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

Co to właściwie jest xs:NCName? I po co by go raczej używać xs:string?

jasso
źródło

Odpowiedzi:

92

NCName to nazwa nieskolonizowana, np. „Nazwa”. W porównaniu do QName, która jest nazwą kwalifikowaną, np. „Ns: name”. Jeśli twoje nazwiska nie mają być kwalifikowane przez różne przestrzenie nazw, to są to NCNames.

xs: string nie nakłada żadnych ograniczeń na twoje nazwy, ale xs: NCName zasadniczo zabrania ":" pojawienia się w ciągu.

Andrey Adamovich
źródło
1
pusty ciąg jest również zabroniony wxs:NCName
WeizhongTu
108

@skyl praktycznie sprowokował mnie do napisania tej odpowiedzi, więc proszę pamiętać o redundancji.

NCNameoznacza „nazwę nieskolonizowaną”. NCName można zdefiniować jako wyrażenie regularne schematu XML[\i-[:]][\c-[:]]*

... i co oznacza to wyrażenie regularne?

\ii \csą wieloznakowymi znakami ucieczki zdefiniowanymi w definicji schematu XML.
http://www.w3.org/TR/xmlschema-2/#dt-ccesN
\i jest ucieczką dla zestawu początkowych znaków nazwy XML i \cjest zbiorem znaków nazwy XML. [\i-[:]]oznacza zbiór składający się z zestawu z \iwyłączeniem zestawu składającego się ze znaku dwukropka :. Więc w prostym języku angielskim oznaczałoby to „dowolny znak początkowy, ale nie :”. Całe wyrażenie regularne ma postać „Jeden początkowy znak nazwy XML, ale bez dwukropka, po którym następuje zero lub więcej znaków nazwy XML, ale nie dwukropek”.

Praktyczne ograniczenia dotyczące NCName

Praktyczne ograniczenia NCName są takie, że nie może ona zawierać kilka znaków symboli, takich jak :, @, $, %, &, /, +, ,, ;, białych znaków lub inny nawias. Ponadto nazwa NCName nie może zaczynać się od cyfry, kropki ani znaku minus, chociaż mogą pojawić się później w NCName.

Gdzie są potrzebne nazwy NCNames

W dokumentach XML zgodnych z przestrzenią nazw wszystkie nazwy muszą być nazwami kwalifikowanymi lub nazwami NCNames. Następujące wartości muszą być nazwami NCNames (nie nazwami kwalifikowanymi):

  • przedrostki przestrzeni nazw
  • wartości reprezentujące identyfikator
  • wartości reprezentujące IDREF
  • wartości reprezentujące NOTACJĘ
  • przetwarzanie celów instrukcji
  • nazwy jednostek
jasso
źródło
3
Wiersz „Ponadto NCName nie może zaczynać się od liczby” pomógł mi zrozumieć, że liczba nie może być „xs: ID”
Sean Murphy
Jak mogę przekonwertować to wyrażenie na język programowania, taki jak Java lub JS?
calbertts
Możesz sprawdzić, czy jest to zwykły CName z wyrażeniem regularnym: "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ _] [\\ w \\. \\ - \\ d] *". To znaczy. wartość powinna zaczynać się od litery lub podkreślenia, a następnie zawierać słowa, kropki, myślniki, podkreślenia, cyfry. Możesz spróbować na: regexr.com
Naxos84
Moje wyrażenie regularne podane powyżej obsługuje tylko litery łacińskie. Jeśli chcesz uzyskać pełne sprawdzenie nazw NC zgodnie ze specyfikacją w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName , użyj tej klasy: java2s.com/Code/Java/XML/ ...
Naxos84
29

Praktycznie mówiąc ...

Dozwolone znaki: - , ., 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

Ponadto -i .nie może być używany jako pierwszy znak wartości.

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

izilotti
źródło
2
Myślę, że brakuje w tym wielu dozwolonych znaków, na przykład é lub ø.
Eric Bloch,
Aby uwzględnić te przypadki, które nie są ASCII, powinno zawierać \ p {L} + jako część zestawu znaków
Kenston Choi,
11
Cyfry również nie mogą być używane jako pierwszy znak.
Thilo,
5

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

Bez spacji i dwukropków. Zezwala na „_” i „-”.

Użyłbyś tego zamiast łańcucha, abyś mógł sprawdzić, czy wartość jest ograniczona do tego, co jest dozwolone. Dobrze odwzorowuje pewne konwencje nazwy / identyfikatora, jak na przykład koncepcja "slug" w django.

Głosuję za osobę, która [\i-[:]][\c-[:]]*tłumaczy dla nas na język angielski.

Skylar Saveland
źródło
11
Dodałem odpowiedź, która tłumaczy się [\i-[:]][\c-[:]]*na angielski. Śmiało i zagłosuj, tak jak obiecałeś;)
jasso