什么是xs:NCName类型,什么时候应使用?


97

我通过模式生成器运行了一个xml文件,生成的所有内容都是预期的,除了一个节点:

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

到底是xs:NCName什么?而且为什么要使用它xs:string呢?

Answers:


92

NCName是非冒号的名称,例如“名称”。与QName相比,后者是限定名称,例如“ ns:name”。如果您的名字不应该由不同的命名空间限定,那么它们就是NCNames。

xs:string完全不限制您的名称,但是xs:NCName基本上禁止在字符串中出现“:”。


1
空字符串也是不允许的xs:NCName
WeizhongTu

108

@skyl实际上激怒了我写这个答案,所以请注意冗余。

NCName代表“非殖民名称”。可以将NCName定义为XML Schema正则表达式[\i-[:]][\c-[:]]*

...正则表达式是什么意思?

\i\c是在XML模式定义中所定义的多字符逃逸。
http://www.w3.org/TR/xmlschema-2/#dt-ccesN
\i是一组初始XML名称字符的转义符,\c也是一组XML名称字符。 [\i-[:]]表示由该组组成的组,\i不包括由冒号组成的组:。因此,用简单的英语来说,它的意思是“任何初始字符,但不是:”。整个正则表达式表示为“一个初始XML名称字符,但不是冒号,后接零个或多个XML名称字符,但不是冒号。”

NCName的实际限制

NCName来的实际限制是它不能包含像几个符号字符:@$%&/+,;,空白字符或不同括号。此外,NCName不能以数字,点或减号开头,尽管它们可以稍后出现在NCName中。

哪里需要NCName

在符合名称空间的XML文档中,所有名称都必须是限定名称或NCName。以下值必须是NCNames(非限定名称):

  • 命名空间前缀
  • 代表ID的值
  • 代表IDREF的值
  • 表示NOTATION的值
  • 处理指令目标
  • 实体名称

3
“此外,NCName不能以数字开头”这一行帮助我理解了数字不能是“ xs:ID”
Sean Murphy

如何将该表达式转换为Java或JS等编程语言?
卡尔伯茨


您可以使用正则表达式检查它是否为常规CName:“ [[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ _] [\\ w \\。\\-\\ d] *”。那就是 该值应以字母或下划线开头,然后包含单词,点,破折号,下划线和数字。您可以在以下网址
Naxos84

我上面给出的正则表达式只处理拉丁字母。如果你想在NCNames全面检查按照规范w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName你应该使用这个类:java2s.com/Code/Java/XML/...
Naxos84

29

实际上是...

允许的字符: -.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz

另外,-并且.不能用作值的第一个字符。

不允许的字符: !"#$%&'()*+,/:;<=>?@[\]^`{|}~


2
我认为这缺少很多允许的字符,例如é或ø。
Eric Bloch

要涵盖这些非ascii情况,应将\ p {L} +作为字符集的一部分包括在内
Kenston Choi 2013年

11
数字也不能用作第一个字符。
Thilo 2015年

5

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

没有空格或冒号。允许“ _”和“-”。

您将使用它而不是字符串,以便可以验证该值是否限制在允许的范围内。例如,它很好地映射到名称/标识符的某些约定,例如django的“ slug”概念。

我支持[\i-[:]][\c-[:]]*为我们翻译成英语的人。


11
我添加了一个翻译[\i-[:]][\c-[:]]*成英语的答案。如您所愿,继续前进并投票;)
jasso
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.