【问题标题】:HTML5 attribute value normalizationHTML5 属性值规范化
【发布时间】:2020-09-20 00:50:27
【问题描述】:

在属性值中的 XML 空格中是 normalized to spaces。因此test="foo#xD#xAbar"(在foobar之间有一个CRLF)在解析时被规范化为test="foo bar"

但是属性规范化是否也发生在 HTML 中——特别是 HTML5? HTML 5.2 spec on attributes 没有提到它。令人惊讶的是,在网络上搜索html5 normalization of attribute values 并没有立即发现任何关于此事的讨论。

我发现一个email on a W3C mailing list 似乎表明HTML4 规范了属性值,但HTML5 没有。它指向了 2011 年的 W3C HTML5 Bug 13709,它没有提供额外的信息。我还找到了 W3C ISSUE-87;这似乎是closed with prejudice,几乎没有讨论过。

让我给你一个应用的例子。我有几个以prefix- 开头的HTML5 CSS 类,包括(其中)prefix-fooprefix-bar。我想选择元素example,但前提是它包含以prefix-开头的类——类似于|=~=属性选择器的组合。

<example class="select">this will be blue</example>
<example class="do-not-select prefix-foo">this should not be blue</example>
<example class="prefix-bar do-not-select">this should not be blue</example>
<example class="select-prefix-is-not-a-prefix">but this <em>should</em> be blue</example>

请注意,最后一个示例有一个 prefix- 子字符串,但不是 CSS 类标记前缀。

我想出了以下选择器,它适用于上述示例:

example:not([class^="prefix-"]):not([class*=" prefix-"]):
  background-color: blue;
;

我担心的是,如果源使用空格而不是空格,选择器是否仍然有效。例如:

<example class="do-not-select


prefix-foo">this should not be blue either</example>

令人惊讶的是,这在 Firefox 和 Chrome 上都有效。似乎属性源中的换行符正在规范化为 DOM 中的空间。或者可能没有发生规范化,但是一些 CSS 规范表明属性选择器中的空格应该匹配任何空格(即规范化是在匹配期间而不是在解析期间)。

现在我已经解释了我的用例,让我简化测试用例。采用这种 CSS 样式:

div[class*=" prefix-"] {
  background-color: green;
;

并获取此 HTML:

<div class="select prefix-foo">this should be green</div>

<div class="select

prefix-foo">this should be green only if whitespace is normalized</div>

在 Firefox 和 Chrome 中,这两个对我来说都是绿色的。

HTML5 specification for class 表示该值为space-separated,其中包括任何space characters,包括制表符和换行符。不过,它没有说明标准化。

谁能解释一下,引用相关权威规范,HTML5是否规范了属性值; CSS 属性选择器中的空格是按字面意思匹配还是匹配任何空格?

【问题讨论】:

  • 澄清一下,.select-prefix-is-not-a-prefix 应该是蓝色的(顾名思义),并且是。但是在我的测试中,类属性中带有换行符的示例也注册为蓝色。在 CSS 中,空白规范化只发生在字符串之外。
  • 对,我把我的“选择”和“匹配”搞混了。也许我应该找到一种没有not() 的简化示例的方法。 (我正在复制我的特定用例。)我现在已经修正了错字。现在,BoltClock,关于空白规范化的任何想法?您的评论似乎暗示了属性的 CSS 规范化——但这个问题的全部主旨是:是否确实存在规范化,如果有,基于什么权威?
  • 据我所知,CSS 不会对属性值中的字符串中的空格进行规范化。除非您使用转义序列(例如 \a 换行),否则它将规范化字符串外部源中的换行符。见drafts.csswg.org/selectors/#case-sensitivew3.org/TR/CSS21/syndata.html#characters
  • 那么,BoltClock,如果 CSS 不规范空白,那么为什么当前会按预期跳过带有换行符的类? :not([class*=" prefix-"]) 不应该工作,除非换行符被规范化为空格,对吗?我将在问题中添加一个简化示例。
  • 啊,BoltClock,我发现了问题。我可以看到为什么换行示例对您不起作用。我的源文件(正确地)被解释为 XHTML5,而不是 HTML5。你是对的:HTML 中似乎没有属性规范化。 (请参阅我的单独答案。)感谢您的讨论。

标签: html css css-selectors normalization


【解决方案1】:

我认为问题在于我的测试文件是一个 XHTML5 文件,并且浏览器遵循 XML 属性规范化规则。当用作 HTML5 时,似乎不会发生属性规范化。

我最初的测试用例实际上是一个 XHTML5 文件,存储在例如text.xhtml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">

…

<div class="select prefix-foo">this should be green</div>

<div class="select

prefix-foo">this should be green only if whitespace is normalized</div>

这是完全有效的 XHTML5。我正在使用生成 HTML5 的静态站点生成器,但我忘记了我的源代码是 XHTML5。当我从文件系统本地测试文件时,Firefox 和 Chrome 都正确地将文件识别为基于 XML 的文件,从而应用 XML 属性规范化规则。

当我运行我的静态站点生成器并提供这些文件时,没有 XML 声明,作为 text/html 文件 (HTML5),Firefox 和 Chrome 没有没有选择第二个 &lt;div&gt;

所以看起来 HTML5 没有规范化属性中的空格。我错误地认为发生这种情况的原因是,我无意中按照 XML 规范化规则对 XHTML5 文件进行了测试

【讨论】:

  • 很高兴你知道了!我在测试中使用了 data:text/html,... - 我应该认为文件类型与它有关(与 application/xhtml+xml 相比)。值得庆幸的是,您提供的赏金很小,而且并非完全徒劳;)
猜你喜欢
  • 2013-04-20
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 2023-03-09
  • 2013-03-02
  • 1970-01-01
  • 2019-07-07
相关资源
最近更新 更多