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?

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.


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

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


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.


11
Saya menambahkan jawaban yang diterjemahkan [\i-[:]][\c-[:]]*ke dalam bahasa Inggris. Silakan dan upvote, seperti yang Anda janjikan;)
jasso
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.