Apa itu tipe xs: NCName dan kapan harus digunakan?

97

Saya menjalankan salah satu file xml saya melalui generator skema dan semua yang dihasilkan seperti yang diharapkan, dengan pengecualian satu node:

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

Apa sebenarnya itu xs:NCName? Dan mengapa seseorang menggunakannya xs:string?

jasso
sumber

Jawaban:

92

NCName adalah nama yang tidak dijajah, misalnya "nama". Dibandingkan dengan QName yang memiliki nama kualifikasi misalnya "ns: name". Jika nama Anda tidak seharusnya memenuhi syarat oleh ruang nama yang berbeda, maka mereka adalah NCNames.

xs: string sama sekali tidak membatasi nama Anda, tetapi xs: NCName pada dasarnya melarang ":" muncul dalam string.

Andrey Adamovich
sumber
1
string kosong juga tidak diizinkan dixs:NCName
WeizhongTu
108

@skyl secara praktis memprovokasi saya untuk menulis jawaban ini jadi mohon perhatian redundansi.

NCNamesingkatan dari "nama yang tidak dijajah". NCName dapat didefinisikan sebagai ekspresi reguler Skema XML[\i-[:]][\c-[:]]*

... dan apa artinya regex itu?

\idan \cpelarian multi-karakter yang ditentukan dalam definisi Skema XML.
http://www.w3.org/TR/xmlschema-2/#dt-ccesN
\i adalah pelarian untuk kumpulan karakter nama XML awal dan \cmerupakan kumpulan karakter nama XML. [\i-[:]]Berarti himpunan yang terdiri dari himpunan \itidak termasuk himpunan yang terdiri dari karakter titik dua :. Jadi dalam bahasa Inggris sederhana itu berarti "karakter awal apa pun, tetapi tidak :". Seluruh ekspresi reguler terbaca sebagai "Satu karakter nama awal XML, tetapi bukan titik dua, diikuti oleh nol atau beberapa karakter nama XML, tetapi bukan titik dua".

Pembatasan praktis dari NCName

Pembatasan praktis NCName adalah bahwa hal itu tidak dapat berisi beberapa karakter simbol seperti :, @, $, %, &, /, +, ,, ;, spasi karakter atau kurung yang berbeda. Selain itu, NCName tidak dapat dimulai dengan angka, titik, atau karakter minus meskipun bisa muncul nanti dalam NCName.

Di mana NCNames dibutuhkan

Dalam dokumen XML yang sesuai dengan namespace, semua nama harus nama yang memenuhi syarat atau NCNames. Nilai berikut harus NCNames (bukan nama yang memenuhi syarat):

  • awalan namespace
  • nilai yang mewakili sebuah ID
  • nilai-nilai yang mewakili IDREF
  • nilai-nilai yang mewakili sebuah NOTASI
  • memproses target instruksi
  • nama entitas
jasso
sumber
3
Baris 'Selanjutnya NCName tidak dapat dimulai dengan angka' membantu saya memahami bahwa angka tidak boleh menjadi 'xs: ID'
Sean Murphy
Bagaimana cara mengubah ekspresi tersebut menjadi bahasa pemrograman seperti Java atau JS?
calbertts
Anda dapat memeriksa apakah ini CName biasa dengan regex: "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ _] [\\ w \\. \\ - \\ d] *". Itu berarti. nilai harus dimulai dengan huruf atau garis bawah dan kemudian berisi kata, titik, tanda hubung, garis bawah, angka. Anda dapat mencobanya di: regexr.com
Naxos84
Regex saya yang diberikan di atas hanya menangani huruf latin. Jika Anda ingin memeriksa lengkap NCNames sesuai dengan spesifikasi w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName, Anda harus menggunakan kelas ini: java2s.com/Code/Java/XML/…
Naxos84
29

Secara praktis ...

Karakter yang diizinkan: - , ., 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

Juga, -dan .tidak dapat digunakan sebagai karakter pertama dari nilai.

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

izilotti
sumber
2
Saya pikir ini kehilangan banyak karakter yang diizinkan seperti, misalnya, é atau ø.
Eric Bloch
Untuk mencakup kasus non-ascii tersebut, itu harus menyertakan \ p {L} + sebagai bagian dari himpunan karakter
Kenston Choi
11
Digit juga tidak dapat digunakan sebagai karakter pertama.
Thilo
5

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

Tidak ada spasi atau titik dua. Mengizinkan "_" dan "-".

Anda akan menggunakan ini sebagai pengganti string sehingga Anda dapat memvalidasi bahwa nilainya terbatas pada apa yang diizinkan. Ia memetakan dengan baik ke konvensi tertentu untuk nama / pengenal seperti konsep django tentang "slug", misalnya.

Saya memberi suara positif pada orang yang [\i-[:]][\c-[:]]*menerjemahkan ke dalam bahasa Inggris untuk kami.

Skylar Saveland
sumber
11
Saya menambahkan jawaban yang diterjemahkan [\i-[:]][\c-[:]]*ke dalam bahasa Inggris. Silakan dan upvote, seperti yang Anda janjikan;)
jasso