Css3 命名空间namespaces—模块级别3

摘要

CSS命名空间模块定义了在CSS中使用命名空间的语法。他为了声明默认的命名空间和绑定命名空间到namespace前缀上而定义了@namespace规则,且他也定义了其他规范能采纳使用那些在命名空间合法名字中的前缀的语法。

简介

本段仍不是标准的。

CSS命名空间模块定义了在CSS中使用命名空间的语法。他为了声明默认的命名空间和绑定命名空间到namespace前缀上而定义了@namespace规则。他也定义了使用那些前缀来代表命名空间合法的名字的语法。他没有定义那样的名字在哪里是有效的或者他们有何意义:那取决于他们的上下文以及是否是通过宿主host语言(主语言)定义的,例如选择符Selectors,其引用了在CSS命名空间模块定义的语法。

注意不支持这个模块的CSS客户端会忽略所有的@namespace规则,就像所有的样式规则使用的是命名空间合法的名字一样。在CSS中划定namespace前缀的语法是很慎重的,这样这些CSS客户端会忽略这些样式规则而不是可能会错误的匹配他们。

一致性Conformance

一个文档或者实现者不能单独的符合CSS命名空间,但是他满足本规范的一致性要求(如果他实现的CSS或者其他宿主语言规范地参照本规范)的话,能声称符合CSS命名空间。

命名空间一致性定义涉及两类:

  • 样式表style sheet

    CSS样式表(或者规范地参照CSS命名空间的另一个宿主语言的一个完整单元)。

  • 解释器interpreter

    解释样式表语义的人或者东西。(CSS用户代理在这一类中。)

术语

除了本规范介绍的条款,CSS命名空间使用的是XML1.0中的命名空间的术语。然而,这里定义的语法不是受限于表现XMP元素和属性名的,且可以表现宿主语言定义的其他类型的命名空间。

在CSS命名空间中一个命名空间名字如果是空字符串的,那么其就代表了命名空间为空或者缺少命名空间。

例子2:

例如给定如下的命名空间声明:

@namespace empty "";
@namespace "";
类型选择符elem, elem 和 empty elem 都是相等的。

声明命名空间:@namespace规则

@namespace的at@规则声明了一个命名空间前缀,且用给定的命名空间名字(字符串)关联起来。命名空间前缀之后还能用在命名空间合法名字中,比如下边定义的‘CSS合法名字’。

例子3:

@namespace "http://www.w3.org/1999/xhtml";
@namespace svg "http://www.w3.org/2000/svg";

第一条规则声明了一个默认的命名空间http://www.w3.org/1999/xhtml用于应用到没有明确命名空间组件的名字上。

第二条规则声明一个命名空间前缀svg,他是用来应用在使用svg命名空间前缀的命名空间http://www.w3.org/2000/svg上的。

在CSS命名空间中,如同在XML1.0中的命名空间,前缀只是语法概念;他是具有重要意义的扩展名(本地名字和命名空间名字的元组tuple)。因此实际上的前缀是在CSS样式表中使用的,且无论他们是否是默认的,他们是使用在标记中的独立的命名空间前缀,且无论他们是否是默认的。

例子4:

例如,给定如下的XML文档:

<qml:elem xmlns:qml="http://example.com/q-markup"></qml:elem>

和下边的在CSS文件开头的@namespace声明:

@namespace Q "http://example.com/q-markup";
@namespace lq "http://example.com/q-markup";

在那个CSS文件中的选择符Q|elemlq|elem都会匹配元素<qml:elem>

(选择符qml|elem会是无效的,因为CSS命名空间仅仅识别在CSS中声明的前缀,而不是那些通过文档语言声明的。)

语法

@namespace规则的语法如下:

namespace
  : NAMESPACE_SYM S* [namespace_prefix S*]? [STRING|URI] S* ';' S*
  ;
namespace_prefix
  : IDENT
  ;

使用是下边的新的标记token:

@{N}{A}{M}{E}{S}{P}{A}{C}{E} {return NAMESPACE_SYM;}

任何的@namespace规则必须遵循所有的@charset@import规则,且在所有的其他的非忽略at@规则和在样式表中的样式规则之前。对于CSS语法,这是在样式表语法中[ import [S|CDO|CDC]* ]*之后立即增加了[ namespace [S|CDO|CDC]* ]*

一个语法上无效的@namespace规则(不管是畸形还是错位)必须被忽略。CSS样式表包含了一个无效的@namespace规则不是一个有效的样式表。

一个解析自URI语法的URI字符串必须以文本字符串对待:用字符串语法,不应用URI规范标准化。

@namespace声明中的所有的字符串——包括空字符串和代表无效URI的字符串——都是有效的命名空间名字。

作用域scope

命名空间前缀只能在样式表(出现@namespace规则)中声明。他不是在通过那个样式表导入的任何样式表中声明的,也不是在应用到文档上的其他的样式表中声明的。

声明前缀

一旦声明了的命名空间前缀代表了他声明的和能用到表示命名空间合法名字的命名空间。命名空间前缀(像CSS计数器名字)是区分大小的。

如果在命名空间声明中命名空间前缀是省略了的,那么这样声明的命名空间就是默认的命名空间。默认的命名空间可以应该到没有明确命名空间前缀的名字上:使用命名空间前缀的模块必须定义默认的命名空间应用到那些上下文中。例如,在选择符中默认的命名空间应该到类型选择符上——但是不会应用到属性选择符上。对于默认命名空间来说是没有默认值的:给默认命名空间指定不受合法名字的模块必须定义当没有声明默认命名空间时那些不合法的名字是如何被解释的。

注意:注意使用命名空间和类型选择符连接能引起支持默认命名空间的用户代理和不支持默认命名空间的用户代理会不同的解释选择符。

如果一个命名空间前缀或者默认命名空间声明了多次,应该使用最后的声明。多次声明一个命名空间前缀或者默认命名空间是不合法的。

CSS合法名字

CSS合法名字是明确在位于(和命名空间有联系)一个命名空间中的名字。为了在CSS语法中产生合法名字,一个已经在作用域中声明的命名空间前缀插入到一个本地名字(例如一个元素或者属性名)之前,被竖线( ,U+007C)分隔。代表了已经声明了的命名空间的前缀表明了本地名字的命名空间。一个合法名字的前缀可以为了表明这个名字不属于任何命名空间而省略,命名空间的部分扩展名没有值。一些环境中(由宿主语言定义的)可以允许使用星号(*,U+002A)作为一个通配符前缀,为了在任何的命名空间(包括无命名空间)中表明一个名字。

例子5:

给定如下的命名空间声明:

@namespace toto "http://toto.example.org";
@namespace "http://example.com/foo";

在一个上下文中,这个上下文中的默认命名空间应用在

  • __toto A__
表示名字A在`http://toto.example.org`命名空间中。
  • __ B__
表示名字B属于无命名空间。
  • __* C__
表示名字C在任何命名空间中,包含无命名空间。
  • D
表示名字D在`http://example.org/foo`命名空间中。

在本地名字之前的CSS合法名字——允许通配符前缀(wqname)合法名字和不允许通配符前缀(qname)合法名字——的部分语法在下边给定。

(这个语法使用CSS2.1语法附录中的记法。注意这意味着注解 ——不是空格——是在标记token之间隐式允许的):

qname_prefix
  : namespace_prefix? '|'
  ;
wqname_prefix
  : [ namespace_prefix? | '*' ] '|'
  ;
qname
  : qname_prefix? ident
  ;
wqname
  : wqname_prefix? ident
  ;
wqwname
  : wqname_prefix? [ ident | '*' ]
  ;

CSS合法名字能使用在(例如)选择符和属性值中,就像在其他模块中描述的那样。那些模块必须定义处理没有正确声明的命名空间前缀。这样的声明应该将未声明的命名空间前缀作为一个解析错误(那会导致在CSS中选择符或者声明等等被认为无效且会被忽略)来对待。

例子6:

例如,选择符模块定义带有未声明命名空间前缀的类型选择符为无效的选择符,且CSS需要带有无效选择符的样式规则完全被忽略。

发布于: 2014年 08月 22日