Loại xs: NCName là gì và nên sử dụng nó khi nào?


97

Tôi đã chạy một trong các tệp xml của mình thông qua trình tạo giản đồ và mọi thứ được tạo đều như mong đợi, ngoại trừ một nút:

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

Chính xác là xs:NCNamegì? Và tại sao người ta lại sử dụng nó xs:string?

Câu trả lời:


92

NCName là tên không thuộc địa hóa, ví dụ "tên". So với QName là tên đủ điều kiện, ví dụ "ns: name". Nếu tên của bạn không được cho là đủ điều kiện bởi các không gian tên khác nhau, thì chúng là NCNames.

xs: string không hạn chế tên của bạn, nhưng về cơ bản xs: NCName không cho phép ":" xuất hiện trong chuỗi.


1
chuỗi rỗng cũng là không được phép trongxs:NCName
WeizhongTu

108

@skyl thực tế đã kích động tôi viết câu trả lời này nên xin hãy nhớ về phần dư thừa.

NCNamelà viết tắt của "tên không thuộc địa". NCName có thể được định nghĩa là một biểu thức chính quy của Lược đồ XML[\i-[:]][\c-[:]]*

... và regex đó có nghĩa là gì?

\i\clà các thoát nhiều ký tự được định nghĩa trong định nghĩa Lược đồ XML.
http://www.w3.org/TR/xmlschema-2/#dt-ccesN
\i là lối thoát cho tập các ký tự tên XML ban đầu và \clà tập các ký tự tên XML. [\i-[:]]nghĩa là một tập hợp bao gồm tập hợp \ikhông bao gồm một tập hợp bao gồm ký tự dấu hai chấm :. Vì vậy, trong tiếng Anh đơn giản, nó có nghĩa là "bất kỳ ký tự đầu tiên nào, nhưng không phải :". Toàn bộ biểu thức chính quy đọc là "Một ký tự tên XML đầu tiên, nhưng không phải dấu hai chấm, theo sau là không hoặc nhiều ký tự tên XML, nhưng không phải là dấu hai chấm."

Các hạn chế thực tế của NCName

Các hạn chế thực tế của NCName là rằng nó không thể chứa một số nhân vật biểu tượng như :, @, $, %, &, /, +, ,, ;, khoảng trắng hoặc ký tự ngoặc khác nhau. Hơn nữa, NCName không thể bắt đầu bằng một số, dấu chấm hoặc ký tự trừ mặc dù chúng có thể xuất hiện sau đó trong NCName.

NCNames cần ở đâu

Trong các tài liệu XML tuân thủ không gian tên, tất cả các tên phải là tên đủ điều kiện hoặc tên NCN. Các giá trị sau phải là NCNames (không phải tên đủ điều kiện):

  • tiền tố không gian tên
  • giá trị đại diện cho một ID
  • giá trị đại diện cho một IDREF
  • giá trị đại diện cho một LƯU Ý
  • xử lý mục tiêu hướng dẫn
  • tên thực thể

3
Dòng 'Hơn nữa tên NCN không thể bắt đầu bằng số' đã giúp tôi hiểu rằng một số không thể là 'xs: ID'
Sean Murphy

Làm cách nào để chuyển đổi biểu thức đó sang ngôn ngữ lập trình như Java hoặc JS?
calbertts


Bạn có thể kiểm tra kỹ hơn đó là CName thông thường bằng regex: "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ _] [\\ w \\. \\ - \\ d] *". Điều đó có nghĩa là. giá trị phải bắt đầu bằng một chữ cái hoặc dấu gạch dưới và sau đó chứa các từ, dấu chấm, dấu gạch ngang, dấu gạch dưới, chữ số. Bạn có thể thử tại: regexr.com
Naxos84

Regex của tôi đưa ra ở trên chỉ xử lý các chữ cái latin. Nếu bạn muốn kiểm tra đầy đủ NCNames theo đặc điểm kỹ thuật w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName, bạn nên sử dụng lớp này: java2s.com/Code/Java/XML/…
Naxos84

29

Nói thực tế...

Ký tự cho phép: - , ., 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

Ngoài ra, -.không thể được sử dụng làm ký tự đầu tiên của giá trị.

Ký tự không được phép: , !, ", #, $, %, &, ', (, ), *, +, ,, /, :, ;, <, =, >, ?, @, [, \, ], ^, `, {, |, },~


2
Tôi nghĩ rằng điều này thiếu rất nhiều ký tự được phép như, ví dụ, é hoặc ø.
Eric Bloch

Để trang trải những trường hợp không ascii, cần bao gồm \ p {L} + như một phần của bộ ký tự
Kenston Choi

11
Các chữ số cũng không được dùng làm ký tự đầu tiên.
Thilo

5

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

Không có dấu cách hoặc dấu hai chấm. Cho phép "_" và "-".

Bạn sẽ sử dụng chuỗi này thay vì chuỗi để bạn có thể xác nhận rằng giá trị được giới hạn ở những gì được phép. Nó ánh xạ tốt đến các quy ước nhất định cho tên / định danh như khái niệm "slug" của django chẳng hạn.

Tôi ủng hộ người [\i-[:]][\c-[:]]*dịch sang tiếng Anh cho chúng tôi.


11
Tôi đã thêm một câu trả lời dịch [\i-[:]][\c-[:]]*sang tiếng Anh. Hãy tiếp tục và ủng hộ, như bạn đã hứa;)
jasso
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.