ประเภท xs: NCName คืออะไรและควรใช้เมื่อใด


97

ฉันรันไฟล์ xml ของฉันผ่านตัวสร้างสคีมาและทุกอย่างที่สร้างขึ้นเป็นสิ่งที่คาดหวังยกเว้นโหนดเดียว:

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

คืออะไรกันแน่xs:NCName? แล้วทำไมถึงใช้มันxs:stringล่ะ?

คำตอบ:


93

NCNameไม่ใช่ชื่ออาณานิคมเช่น "ชื่อ" เมื่อเทียบกับ QName ซึ่งเป็นชื่อที่มีคุณสมบัติเช่น "ns: name" หากชื่อของคุณไม่ควรผ่านการรับรองจากเนมสเปซที่แตกต่างกันแสดงว่าชื่อนั้นเป็น NCNames

xs: string ไม่มีข้อ จำกัด ใด ๆ กับชื่อของคุณเลย แต่ xs: NCName โดยทั่วไปไม่อนุญาตให้ ":" ปรากฏในสตริง


1
ไม่อนุญาตให้ใช้สตริงว่างในxs:NCName
WeizhongTu

109

@skyl กระตุ้นให้ฉันเขียนคำตอบนี้ดังนั้นโปรดคำนึงถึงความซ้ำซ้อน

NCNameย่อมาจาก "non-colonized name" NCName สามารถกำหนดให้เป็นนิพจน์ทั่วไปของ XML Schema[\i-[:]][\c-[:]]*

... และ regex หมายความว่าอย่างไร?

\iและ\cเป็นค่า Escape แบบหลายอักขระที่กำหนดไว้ในข้อกำหนด XML Schema
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 (ไม่ใช่ชื่อที่ผ่านการรับรอง):

  • คำนำหน้าเนมสเปซ
  • ค่าแทน ID
  • ค่าแทน IDREF
  • ค่าที่แสดงถึงการแจ้งเตือน
  • การประมวลผลเป้าหมายคำสั่ง
  • ชื่อนิติบุคคล

3
บรรทัด 'นอกจากนี้ NCName ไม่สามารถขึ้นต้นด้วยตัวเลข' ช่วยให้ฉันเข้าใจว่าตัวเลขไม่สามารถเป็น 'xs: ID'
ฌอนเมอร์ฟี

ฉันจะแปลงนิพจน์นั้นเป็นภาษาโปรแกรมเช่น Java หรือ JS ได้อย่างไร
calbertts


คุณสามารถตรวจสอบว่ามันเป็น CName ปกติด้วย regex: "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ _] [\\ w \\. \\ - \\ d] *" นั่นหมายความว่า. ค่าควรขึ้นต้นด้วยตัวอักษรหรือขีดล่างแล้วประกอบด้วยคำจุดขีดกลางขีดล่างตัวเลข คุณสามารถลองใช้งานได้ที่: regexr.com
Naxos84

regex ของฉันที่ให้ไว้ด้านบนจัดการเฉพาะตัวอักษรละติน หากคุณต้องการตรวจสอบ 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
ฉันคิดว่านี่ขาดอักขระที่อนุญาตเช่นéหรือø
Eric Bloch

เพื่อให้ครอบคลุมกรณีที่ไม่ใช่ ascii เหล่านั้นควรมี \ p {L} + เป็นส่วนหนึ่งของชุดอักขระ
Kenston Choi

11
ไม่สามารถใช้ตัวเลขเป็นอักขระตัวแรกได้เช่นกัน
Thilo

5

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

ไม่มีช่องว่างหรือเครื่องหมายทวิภาค อนุญาตให้ "_" และ "-"

คุณจะใช้สิ่งนี้แทนสตริงเพื่อให้ตรวจสอบได้ว่าค่านี้ จำกัด เฉพาะที่อนุญาต มันจับคู่ได้ดีกับแบบแผนบางประการสำหรับชื่อ / ตัวระบุเช่นแนวคิดของ django เกี่ยวกับ "slug" เป็นต้น

ฉันโหวตให้คนที่[\i-[:]][\c-[:]]*แปลเป็นภาษาอังกฤษให้เรา


11
ฉันได้เพิ่มคำตอบที่แปล[\i-[:]][\c-[:]]*เป็นภาษาอังกฤษ ไปข้างหน้าและโหวตเพิ่มตามที่คุณสัญญาไว้;)
jasso
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.