gpt4 book ai didi

linux - xmllint 无法验证 XHTML 1.0 过渡文件

转载 作者:太空狗 更新时间:2023-10-29 12:42:33 26 4
gpt4 key购买 nike

在 Debian Jessie GNU/Linux 上重现的步骤。

检查 xmllint 版本:

$ xmllint --version
xmllint: using libxml version 20901
compiled with: Threads Tree Output Push Reader Patterns Writer SAXv1 FTP HTTP DTDValid HTML Legacy C14N Catalog XPath XPointer XInclude Iconv ISO8859X Unicode Regexps Automata Expr Schemas Schematron Modules Debug Zlib Lzma

通过将其另存为 example.xhtml 制作一个 XHTML 1.0 Transitional 文件:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>A title</title>
</head>

<body>
Some content
</body>

</html>

注意将 example.xhtml 的内容粘贴到 W3C Validator 会产生“此文档已成功检查为 XHTML 1.0 Transitional!”,因此在使用 xmllint 时也应该进行验证。

xmllint在线验证

这失败了,尽管计算机可以访问互联网:

$ xmllint --noout --valid example.xhtml
example.xhtml:1: warning: failed to load external entity "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
^
example.xhtml:2: validity error : Validation failed: no DTD found !
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
^

xmllint离线验证

安装 XHTML 1.0 DTDs and entity files :

$ wget -qO- https://www.w3.org/TR/xhtml1/xhtml1.tgz | tar xvz
xhtml1-20020801/
xhtml1-20020801/W3C-REC.css
xhtml1-20020801/xhtml.css
xhtml1-20020801/logo-REC.png
xhtml1-20020801/w3c_home.png
xhtml1-20020801/wcag1AAA.png
xhtml1-20020801/acks.html
xhtml1-20020801/Cover.html
xhtml1-20020801/definitions.html
xhtml1-20020801/diffs.html
xhtml1-20020801/dtds.html
xhtml1-20020801/guidelines.html
xhtml1-20020801/introduction.html
xhtml1-20020801/issues.html
xhtml1-20020801/normative.html
xhtml1-20020801/Overview.html
xhtml1-20020801/prohibitions.html
xhtml1-20020801/references.html
xhtml1-20020801/xhtml1-diff.html
xhtml1-20020801/DTD/
xhtml1-20020801/DTD/xhtml-lat1.ent
xhtml1-20020801/DTD/xhtml-special.ent
xhtml1-20020801/DTD/xhtml-symbol.ent
xhtml1-20020801/DTD/xhtml.soc
xhtml1-20020801/DTD/xhtml1-frameset.dtd
xhtml1-20020801/DTD/xhtml1-strict.dtd
xhtml1-20020801/DTD/xhtml1-transitional.dtd
xhtml1-20020801/DTD/xhtml1.dcl
xhtml1-20020801/xhtml1.ps
xhtml1-20020801/xhtml1.pdf

仍然失败:

$ xmllint --noout --dtdvalid xhtml1-20020801/DTD/xhtml1-transitional.dtd example.xhtml 
example.xhtml:1: warning: failed to load external entity "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
^

同样,如果使用 --nonet 选项:

$ xmllint --noout --nonet --dtdvalid xhtml1-20020801/DTD/xhtml1-transitional.dtd example.xhtml 
I/O error : Attempt to load network entity http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
example.xhtml:1: warning: failed to load external entity "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
^

问题

我有两个问题:

  1. 为什么这些验证尝试都没有成功?
  2. 第二个似乎失败了,因为尽管使用了 --dtdvalid 选项,xmllint 仍然尝试访问 http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd 因为它在 example.xhtml 中被引用。有什么方法可以告诉 xmllint 忽略该引用并改用本地 DTD(例如,已经存储在 xhtml1-20020801/DTD/xhtml1-transitional.dtd 中的 DTD) ?

最佳答案

看起来最简单的解决方法是:

$ sudo apt-get install w3c-dtd-xhtml

这会在本地安装相关的 DTD。此后,验证成功:

$ xmllint --noout --valid example.xhtml
$

然而,尽管这允许我验证 XHTML 文件,但它并没有真正回答问题。因此,我不会将此问题标记为“已回答”,希望有人提供确实回答他们的答案。

关于linux - xmllint 无法验证 XHTML 1.0 过渡文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37242391/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com