什么是xs:NCName类型,什么情况下应该使用它?

108

我将我的一个XML文件通过模式生成器运行了一遍,除了一个节点之外,生成的结果都符合预期:

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

什么是xs:NCName?为什么要使用它,而不是xs:string

4个回答

129

@skyl几乎逼迫我写这个答案,所以请注意冗余。

NCName代表“非冒号名称”。NCName可以定义为XML模式正则表达式[\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中出现。

NCNames在哪里需要

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

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

5
“此外,NCName 不能以数字开头”这句话帮助我理解一个数字不能成为“xs:ID”。 - Sean Murphy
我该如何将那个表达式转换成像Java或JS这样的编程语言? - calbertts
@calbertts,请查看 https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html。 - Kirby
您可以使用正则表达式检查它是否为常规CName:"[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_][\w\.\-\d]*"。这意味着该值应以字母或下划线开头,然后包含单词、点、破折号、下划线和数字。您可以在以下网址尝试:https://regexr.com/ - Naxos84
我上面给出的正则表达式只处理拉丁字母。 如果您想根据规范https://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName对NCNames进行完整检查,您应该使用此类:http://www.java2s.com/Code/Java/XML/CheckswhetherthesuppliedStringisanNCNameNamespaceClassifiedName.htm - Naxos84

99

NCName 是非冒号化的名称,例如 "name"。与限定名称 QName 相比,例如 "ns:name"。如果您的名称不应由不同命名空间限定,则它们是 NCNames。

xs:string 对您的名称没有任何限制,但 xs:NCName 基本上禁止字符串中出现 ":"。


2
在编程中,空字符串在xs:NCName中也是不允许的。 - WeizhongTu

30
实际上...... 允许使用的字符:-.0-9A-Z_a-z,以及所有匹配 \p{L}+ 的非 ASCII 字符。

此外,数字、-. 不能作为值的第一个字符。

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

4
我认为这里缺少很多允许的字符,比如é或ø。 - Eric Bloch
为了涵盖那些非ASCII情况,它应该将\p{L}+作为字符集的一部分。 - Kenston Choi
16
数字也不能用作第一个字符。 - Thilo

8

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

不能包含空格或冒号。允许使用“_”和“-”。

您可以使用此选项代替字符串,以便验证该值仅限于所允许的内容。它很好地映射到某些名称/标识符约定,例如Django的“slug”概念。

我会为我们翻译[\i-[:]][\c-[:]]*的人点赞。


13
我添加了一个将[\i-[:]][\c-[:]]*翻译成英语的答案。请按照你的承诺进行点赞;) - jasso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接