如何验证xhtml?
如何验证 XHTML 意味着检查文档是否符合两层规则:XML 语法及其声明的 DTD 或模式。 XHTML 1.0 是 HTML 4.01 在 XML 中的重新表述,因此文档可以是格式良好但无效的,就像 XHTML 1.0 Strict 中出现 <a target="_blank"> 时一样。
验证 XHTML 意味着检查文档是否同时符合两层规则:
- XML 语法规则:正确嵌套的标签、引号中的属性、所有元素的强制结束(包括像
<br />这样的空元素)、单个根元素、一致的声明编码等。 - DTD 规则或声明的模式:存在哪些元素和属性、它们可以出现在什么上下文中以及允许哪些值。以下是 XHTML 1.0(严格、过渡、框架集)、XHTML 1.1、XHTML Basic 和 XHTML Modularization 的经典 DTD。
文档可以是格式良好的 XML,但仍然无效:例如,如果您在 XHTML 1.0 Strict 中使用 <a target="_blank">,语法是无可挑剔的,但该 DTD 中不存在 target 属性。当有人看到错误但不明白原因时,“格式良好”和“有效”之间的这种区别是造成混乱的首要原因。
还可以方便地记住,XHTML 1.0 是由 W3C 定义的 XML 中 HTML 4.01 的重新表述。如今,它的实用价值是双重的:它适用于仍然以“application/xhtml+xml”或“text/html”形式服务的遗留项目,并且它可以作为编写干净标记的心理训练。如果您想要有关如何验证 XHTML 的完整规范上下文,W3C XHTML 1.0 规范 是主要来源。
值得使用的验证器(以及何时使用其中之一)
不存在单一的“正确”验证器。选择取决于您是要验证片段、生产页面、整个站点还是已经是 XHTML5 的文档。
| 工具 | 验证内容 | 理想用途 | 主要限制 |
|---|---|---|---|
| W3C 标记验证服务 (validator.w3.org) | XHTML 1.0/1.1、HTML4、HTML5 | 通过 URL、文件或直接粘贴进行单点验证 | 现代的“Nu Html Checker”优先考虑 HTML5;旧的 DTD 需要手动选择 |
| Nu Html 检查器 (vnu) | HTML5 和 XHTML5 | 新项目、本地验证和 CI | 不支持 XHTML 1.x 的经典 DTD |
| 本地验证器 (vnu.jar, tidy) | 取决于配置 | 自动化、预提交、管道 | 需要安装 Java 或二进制文件;初始配置 |
| xmllint | 格式良好的 XML 和相对于 DTD/XSD 的验证 | 检查纯 XML 层 | 除了模式之外,不了解 HTML 的特定规则 |
| 浏览器 / IDE 扩展 | 实时标记 | 编写时的即时反馈 | Suelen usar motores desactualizados or incompletetos |
W3C 标记验证服务
对于那些想知道如何验证 XHTML 的人来说,它仍然是一个起点。它支持三种模式:通过 URI 验证、通过文件上传验证和通过直接输入验证。对于经典的 XHTML,技巧在于“文档类型”下拉列表:如果您的文档通过“DOCTYPE”声明了自己的 DTD,则验证器会尊重它;如果没有,你必须手动强制它。
Related: — con plan gratuito para empezar hoy mismo.
许多人不知道的细节是:现代 W3C 验证器依赖于 Nu Html Checker,它理解 HTML5 和 XHTML5,但对旧 DTD 的优先级较低。对于 XHTML 1.0 Strict,它仍然有效,但建议验证结果是否反映了您期望的 DTD,而不是宽松的解释。
Nu Html 检查器 (vnu)
这是 W3C 本身内部使用的验证器。它以 Web 服务、JAR 可执行文件和 Docker 映像的形式存在。它的一大优点是您可以在本地运行并持续集成,如果您维护大型站点,这一点至关重要。对于充当“application/xhtml+xml”的 XHTML,vnu 会检测宽容的 HTML 验证器会允许通过的嵌套和属性错误。
xmllint
如果您关心的是纯 XML 层(例如,因为您从 XSLT 模板生成 XHTML),那么“xmllint”是不可替代的。使用“—noout —valid documento.xhtml”,它会根据引用的 DTD 检查格式正确性和有效性。它速度快、可编写脚本并且不依赖于网络。
Worth a look: — Accesibilidad gestionada: automatización combinada con revisión humana.
在编辑器中验证
VS Code、IDE 插件和命令行工具的扩展可提供即时反馈。它们很方便,但往往落后于标准。将它们用作第一道防线,而不是唯一的验证。
如何一步步验证XHTML
1. 正确声明 DOCTYPE 和编码
DOCTYPE 确定它根据哪些规则进行验证。对于严格 XHTML 1.0:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<头>
<meta http-equiv="内容类型"
内容=“application/xhtml+xml;字符集=UTF-8”/>
<title>Ejemplo válido</title>
</头>
这里有两个经典错误:忘记“xmlns”属性(XHTML 中必须的)以及在“meta”中声明与实际文件不一致的编码。验证器会检测两者,但第二个有时仅显示为损坏的字符。
2. 在验证有效性之前检查格式良好性
在使用 DTD 之前,请确保 XML 格式良好。 xmllint --noout archivo.xhtml 会在几秒钟内告诉您。如果这里失败,没有 DTD 验证器会帮助您:首先关闭标签,更正嵌套和转义实体(&、<、>)。
3. 验证 DTD
有了格式良好的文档,将其传递给 W3C 验证器或 vnu。不仅要检查“有多少”错误,还要检查“是什么类型”的错误。单个嵌套错误可能会产生一系列次要错误,这些错误在纠正第一个错误后就会消失。
4. 验证整个站点,而不仅仅是首页
一个常见的错误是验证主页并假设其余部分都很好。模板、组件和动态生成的页面通常会引入无效标记。自动化:使用脚本遍历主要 URL 并在每个响应上运行 vnu。
Related: — La que acredita tu experiencia en accesibilidad.
5. 将验证集成到你的工作流中
手动验证无法扩展。在管道(预提交挂钩、构建任务或 CI 作业)中添加验证步骤,如果出现新错误,该验证步骤将失败。这样,无效的标记就永远不会到达生产环境。
错误解释:你将反复看到的错误
- “X 的结束标记被省略,但不允许省略结束标记”:典型的
<li>、<p>或<td>不闭合。在 XHTML 中,一切都必须封闭。 - “没有属性 X”:该属性在您的 DTD 中不存在。常见情况:某些元素中的“target”、“name”、XHTML 1.0 中的“data-*”属性(不在经典 DTD 中)。
- “元素 X 未定义”:使用 DTD 未考虑的元素,通常是将 HTML5 标记复制到 XHTML 1.0 文档中。
- “此处不允许使用字符数据”:DTD 只需要元素的文本内容,或者不转义的
&。 - “对无法生成系统标识符的实体 X 的引用”:未在 XML 中定义的命名 HTML 实体(例如,未声明的“
”)。在纯 XHTML 中使用` 或声明实体。
如何验证 xhtml 的黄金法则:从上到下正确。第一个错误通常是原因;以下是其后果。
XHTML5:改变规则的细微差别
如果您提供 XHTML5(根据 HTML5 语法序列化的 XHTML),则规则会发生变化。不再有 DTD:一致性在 WHATWG HTML 规范和 W3C HTML 规范 中定义。正确的验证器是Nu Html Checker,而不是经典的 DTD 验证器。
关于如何验证 xhtml 需要注意的实际差异:
data-*属性在 XHTML5 中有效,但在 XHTML 1.0 中无效。- DOCTYPE 被简化为
<!DOCTYPE html>。 - 验证是针对 HTML5 的“一致性检查器”进行的,这在某些方面更允许,而在其他方面更严格(例如,在使用某些过时的元素时)。
在 XHTML 1.0 和 XHTML5 之间进行选择不仅仅是技术问题:如果您的项目是新的,那么带有 vnu 验证的 XHTML5 是明智的选择。如果您使用 DTD 维护遗留系统,请保留 XHTML 1.0 并根据其 DTD 进行验证。
验证与可访问性:两个不同的层面
一个常见的错误是认为有效的文档可以自动访问。它不是。验证检查语法和模式一致性;可访问性根据 W3C 的 WCAG 进行评估,其中涵盖感知、可操作性以及与辅助技术的兼容性。
也就是说,确实存在重叠:无效的标记通常意味着结构有缺陷(标题嵌套不良、列表不完整、没有正确标签的表单),这确实会影响可访问性。如何验证 XHTML 和其他文档的明智策略是首先验证(消除结构噪声),然后使用 axe、Lighthouse 或手动审查等工具可访问性**。验证是必要条件,但不是充分条件。
验证 XHTML 时经常出现的错误
在学习如何验证 XHTML 时,请避免以下常见错误:
- 仅验证主页。 有问题的标记通常位于内部模板上。
- 忽略编码。 声明不当的“字符集”会产生幽灵错误。
- **混淆格式正确与有效。**它们是不同的层;按顺序解决它们。
- 使用错误的验证器。 vnu 用于 XHTML5,DTD 用于 XHTML 1.x。
- 在不阅读第一个错误的情况下修复级联错误。 您浪费时间并修复症状。
- 没有自动化。 手动验证无法在第二次冲刺中幸存。
- **假设有效=可访问。**它们是具有不同目的的不同标准。
要点
- 验证 XHTML 涉及两层:格式良好的 XML 和 与声明的 DTD 或模式的一致性。
- W3C 标记验证服务 和 Nu Html Checker (vnu) 是如何验证 xhtml 的参考工具;
xmllint涵盖纯 XML 层。 - 对于 XHTML 1.0/1.1,使用针对 DTD 的验证;对于XHTML5,使用 vnu 并忘记经典的 DTD。
- 从上到下纠正错误:第一个错误通常会导致以下错误。
- 自动化管道中的验证;手动审核无法扩展。
- 有效并不等于可访问:它们是补充标准,而不是等同标准。
资料来源和进一步阅读
- XHTML — 维基百科:可扩展超文本标记语言 (XHTML) 是 XML 标记语言家族的一部分,它镜像或扩展了广泛使用的超文本标记的版本…
- XHTML Basic — 维基百科:XHTML Basic 是一种基于 XML 的标记语言,专为计算能力有限的简单用户代理而设计,例如早期的移动电话、PDA、寻呼机和机顶盒…
常见问题
格式良好的 XHTML 和有效的 XHTML 有什么区别?
格式良好的文档遵循 XML 的语法规则:闭合标签、正确的嵌套以及引号中的属性。此外,有效的文档遵循其声明的 DTD 或模式:仅使用其上下文中允许的元素和属性。您可能有一个格式良好但无效的文档,例如,如果您使用 XHTML 1.0 Strict 中不存在的属性。
2024 年验证 XHTML 还有意义吗?
是的,有两个原因。首先,许多遗留项目继续提供 XHTML 服务,并且需要保持有效,以免破坏 XML 模式。其次,验证是一门检测影响可访问性和维护的结构错误的学科。如果您的项目是新的,它可能使用 HTML5 或 XHTML5,但验证的习惯仍然很有价值。
我应该为 XHTML5 使用哪个验证器?
Nu Html Checker (vnu),作为 Web 服务、可执行 JAR 和 Docker 映像提供。现代 W3C 标记验证服务使用并理解 HTML5 语法及其 XHTML 序列化是同一引擎。不要对 XHTML5 使用经典的 DTD 验证器:它们无法识别“data-*”属性或其他 HTML5 功能。
为什么 W3C 验证器会给我我不理解的错误?
因为许多错误都是前一个错误造成的。不正确的嵌套可能会生成数十条辅助消息。正确的策略是纠正第一个错误,再次验证并重复。验证器也可能应用 DOCTYPE 中声明的 DTD;如果该 DTD 不是您所期望的,则错误将看起来是任意的。
我可以通过命令行验证 XHTML 吗?
是的。如果您想知道如何通过 CLI 验证 XHTML,“xmllint —noout —valid archivo.xhtml”会根据 DTD 检查格式良好性和有效性。对于 HTML5/XHTML5,“vnu.jar archivo.xhtml”执行相同的操作。这两个选项都非常适合集成到构建脚本、预提交挂钩或持续集成作业中,其中手动验证无法扩展。
一个有效的 XHTML 站点会自动具备可访问性吗?
不会。验证检查语法和模式的一致性;可访问性根据 WCAG 进行评估,涵盖对比度、键盘导航、替代文本或语义结构等方面。文档可能完全有效,但仍然不具备无障碍访问能力。首先验证,然后审核无障碍访问情况:它们是互补的层。
Frequently asked questions
XHTML 的形式和 XHTML 的有效性有何区别?
格式良好的文档遵循 XML 的语法规则:闭合标签、正确的嵌套以及引号中的属性。此外,有效的文档遵循其声明的 DTD 或模式:仅使用其上下文中允许的元素和属性。您可能有一个格式良好但无效的文档,例如,如果您使用 XHTML 1.0 Strict 中不存在的属性。
¿2024 年 XHTML 是否有效?
是的,有两个原因。首先,许多遗留项目继续提供 XHTML 服务,并且需要保持有效,以免破坏 XML 模式。其次,验证是一门检测影响可访问性和维护的结构错误的学科。如果您的项目是新的,它可能使用 HTML5 或 XHTML5,但验证的习惯仍然很有价值。
¿Qué validador debo usar para XHTML5?
Nu Html Checker (vnu),作为 Web 服务、可执行 JAR 和 Docker 映像提供。现代 W3C 标记验证服务使用并理解 HTML5 语法及其 XHTML 序列化是同一引擎。不要对 XHTML5 使用经典的 DTD 验证器:它们无法识别数据属性或其他 HTML5 功能。
¿W3C 的验证者是否出现错误?
因为许多错误都是前一个错误造成的。不正确的嵌套可能会生成数十条辅助消息。正确的策略是纠正第一个错误,再次验证并重复。验证器也可能应用 DOCTYPE 中声明的 DTD;如果该 DTD 不是您所期望的,则错误将看起来是任意的。
¿Puedo validar XHTML desde la linea de comandos?
是的。如果您想知道如何通过 CLI 验证 XHTML,请使用 xmllint --noout --valid archivo.xhtml 检查 DTD 的格式良好性和有效性。对于 HTML5/XHTML5,vnu.jar archivo.xhtml 执行相同的操作。这两个选项都非常适合集成到构建脚本、预提交挂钩或持续集成作业中,其中手动验证无法扩展。
XHTML 是否可以自动访问?
不会。验证检查语法和模式的一致性;可访问性根据 WCAG 进行评估,涵盖对比度、键盘导航、替代文本或语义结构等方面。文档可能完全有效,但仍然无法访问。首先验证,然后审核可访问性:它们是互补的层。
¿Cumplir WCAG sin tocar el código?
Superposición de IA que promete cumplimiento WCAG en 48 horas