4

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 

これを次のように保存して、XHTML 1.0 Transitional ファイルを作成しますexample.xhtml

<!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 DTD とエンティティ ファイルをインストールします。

$ 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"
                                                                               ^

質問

2 つの質問があります。

  1. これらの検証の試みがどれも成功しなかったのはなぜですか?
  2. 2 番目のオプションは、で参照されているため、--dtdvalidオプションを使用しているにもかかわらず、xmllintまだアクセスを試みているため、失敗しているようです。その参照を無視し、代わりにローカル DTD (たとえば、既に に保存されているもの) を使用するように指示する方法はありますか?http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtdexample.xhtmlxmllintxhtml1-20020801/DTD/xhtml1-transitional.dtd
4

1 に答える 1

0

最も簡単な回避策は次のとおりです。

$ sudo apt-get install w3c-dtd-xhtml

これにより、関連する DTD がローカルにインストールされます。その後、検証は成功します。

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

ただし、これで XHTML ファイルを検証することはできますが、質問に対する答えにはなりません。したがって、誰かが実際に回答する回答を提供してくれることを期待して、この質問を「回答済み」とマークしません。

于 2016-05-15T20:29:52.797 に答える