Что такое тип xs: NCName и когда его следует использовать?

97

Я запустил один из своих xml-файлов через генератор схемы, и все сгенерированное оказалось ожидаемым, за исключением одного узла:

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

Что именно xs:NCName? А зачем лучше его использовать xs:string?

Жассо
источник

Ответы:

92

NCName - это имя без например «имя». По сравнению с QName, которое является квалифицированным именем, например, "ns: name". Если ваши имена не должны уточняться разными пространствами имен, тогда они NCNames.

xs: string вообще не накладывает ограничений на ваши имена, но xs: NCName в основном запрещает появление ":" в строке.

Андрей Адамович
источник
1
пустая строка также запрещена вxs:NCName
WeizhongTu 05
109

@skyl практически спровоцировал меня написать этот ответ, так что не забывайте об избыточности.

NCNameозначает «неколонизированное имя». NCName можно определить как регулярное выражение схемы XML.[\i-[:]][\c-[:]]*

... и что означает это регулярное выражение?

\iи \cявляются многосимвольными escape-символами, определенными в определении схемы XML.
http://www.w3.org/TR/xmlschema-2/#dt-ccesN
\i - это escape-последовательность для набора начальных символов имени XML и \cнабор символов имени XML. [\i-[:]]означает набор, состоящий из набора, \iза исключением набора, состоящего из символа двоеточия :. Таким образом, на простом английском языке это будет означать «любой начальный символ, но не :». Полное регулярное выражение читается как «Один начальный символ имени XML, но не двоеточие, за которым следует ноль или более символов имени XML, но не двоеточие».

Практические ограничения NCName

Практические ограничения NCName в том , что он не может содержать несколько символов символов , как :, @, $, %, &, /, +, ,, ;, пробельные символы или разные скобка. Кроме того, NCName не может начинаться с числа, точки или символа минуса, хотя они могут появиться позже в NCName.

Где нужны NCNames

В документах XML, соответствующих пространству имен, все имена должны быть либо полными именами, либо NCNames. Следующие значения должны быть NCNames (не полные имена):

  • префиксы пространства имен
  • значения, представляющие идентификатор
  • значения, представляющие IDREF
  • значения, представляющие ОБОЗНАЧЕНИЕ
  • цели инструкций по обработке
  • имена сущностей
Жассо
источник
3
Строка «Кроме того, NCName не может начинаться с числа» помогла мне понять, что число не может быть «xs: ID»
Шон Мерфи
Как я могу преобразовать это выражение в язык программирования, такой как Java или JS?
Calbertts
Вы можете проверить, является ли это обычным CName, с помощью регулярного выражения: "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ _] [\\ w \\. \\ - \\ d] *". Это значит. значение должно начинаться с буквы или символа подчеркивания, а затем содержать слова, точки, дефисы, символы подчеркивания и цифры. Вы можете попробовать это на: regexr.com
Naxos84
Мое регулярное выражение, указанное выше, обрабатывает только латинские буквы. Если вам нужна полная проверка NCNames в соответствии со спецификацией w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName, вам следует использовать этот класс: java2s.com/Code/Java/XML/…
Naxos84
29

Собственно говоря ...

Допустимые символы: - , ., 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

Кроме того, -и .нельзя использовать в качестве первого символа значения.

Запрещенные символы: , !, ", #, $, %, &, ', (, ), *, +, ,, /, :, ;, <, =, >, ?, @, [, \, ], ^, `, {, |, },~

Изилотти
источник
2
Я думаю, что здесь отсутствует множество допустимых символов, таких как, например, é или ø.
Эрик Блох
Чтобы охватить эти случаи, отличные от ascii, он должен включать \ p {L} + как часть набора символов
Kenston Choi
11
Цифры также нельзя использовать в качестве первого символа.
Тило
5

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

Без пробелов и двоеточий. Допускает «_» и «-».

Вы должны использовать это вместо строки, чтобы вы могли проверить, что значение ограничено допустимым. Он хорошо согласуется с определенными соглашениями для имени / идентификатора, например, с концепцией «slug» в django.

Я голосую за человека, который [\i-[:]][\c-[:]]*переводит для нас на английский.

Скайлар Савеланд
источник
11
Я добавил ответ, который переводится [\i-[:]][\c-[:]]*на английский. Продолжайте и поддерживайте, как вы и обещали;)
jasso