【问题标题】:What is an xs:NCName type and when should it be used?什么是 xs:NCName 类型以及何时应该使用它?
【发布时间】:2010-12-10 12:35:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: xml xsd xml-namespaces


    【解决方案1】:

    NCName 是非殖民化名称,例如“姓名”。与 QName 相比,QName 是限定名称,例如“ns:名称”。如果你的名字不应该被不同的命名空间限定,那么它们就是 NCNames。

    xs:string 对你的名字没有任何限制,但 xs:NCName 基本上不允许“:”出现在字符串中。

    【讨论】:

    • xs:NCName中也不允许使用空字符串
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我添加了一个将[\i-[:]][\c-[:]]* 翻译成英文的答案。正如你所承诺的那样继续投票;)
    【解决方案3】:

    @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 的实际限制是它不能包含多个符号字符,如:@$%&amp;/+,、@ 987654344@,空白字符或不同的括号。此外,NCName 不能以数字、点或减号字符开头,尽管它们可以稍后出现在 NCName 中。

    哪里需要 NCNames

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

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

    【讨论】:

    • “此外,NCName 不能以数字开头”这一行帮助我理解了数字不能是“xs:ID”
    • 如何将该表达式转换为 Java 或 JS 等编程语言?
    • 您可以使用正则表达式检查它是否是常规 CName:“[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_][\\w\\.\\-\\d]*”。这意味着。该值应以字母或下划线开头,然后包含单词、点、破折号、下划线、数字。你可以试试:regexr.com
    • 我上面给出的正则表达式只处理拉丁字母。如果您想根据规范w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName 对 NCNames 进行全面检查,您应该使用此类:java2s.com/Code/Java/XML/…
    【解决方案4】:

    实际上...

    允许的字符: -.0123456789ABCDEFGHIJ ,K,L,M,N,O,P,Q,R,S,T,T,U,@9876 987654355 @,XYZ_abcdefgh ,i,j,k,l,m,n,o,p,q,r,s,s,@987654378 987654380@、vwxyz

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

    不允许使用的字符: !"#$%&amp;'(),;&gt;?????\]^`{|}~

    【讨论】:

    • 我认为这缺少很多允许的字符,例如 é 或 ø。
    • 为了覆盖那些非 ascii 的情况,它应该包含 \p{L}+ 作为字符集的一部分
    • 数字也不能用作第一个字符。
    猜你喜欢
    • 2018-09-17
    • 2014-11-02
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多