XSLTでHTML5 Doctypeを設定する


134

XSLTを介してファイルのdoctypeをHTML5 にきれいに設定するにはどうすればよいですか<!DOCTYPE html>(この場合はcollective.xdvを使用

以下は、私のGoogle fooが見つけた中で最高のものです。

<xsl:output
    method="html"
    doctype-public="XSLT-compat"
    omit-xml-declaration="yes"
    encoding="UTF-8"
    indent="yes" />

生成する:

<!DOCTYPE html PUBLIC "XSLT-compat" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

7
ちなみに、PUBLIC "XSLT-compat"の使用は時代遅れです。XSLT互換のHTML5 doctypeが<!DOCTYPE HTML SYSTEM "about:legacy-compat">になりました。dev.w3.org/html5/spec/syntax.html#doctype-legacy-string
Alohci

1
前回のエディターWDからは、ほぼすべてのdoctypeが許可されているように見えます:ショート<!DOCTYPE html>、レガシー<!DOCTYPE HTML SYSTEM "about:legacy-compat">、廃止(「すべきでない」)HTML 4、HTML 4.01、XHTML 1.0およびXHTML 1.1(SYSTEMがある場合はすべて厳密なDTD)。

1
(最近の)W3Cの推奨事項として、HTML5に対するいくつかの回答を更新してください。
Peter Krauss

回答:


147

これは現在doctypeをテキストとして書き出すことによってのみサポートされていると思います:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" encoding="utf-8" indent="yes" />

  <xsl:template match="/">
    <xsl:text disable-output-escaping='yes'>&lt;!DOCTYPE html&gt;</xsl:text>
    <html>
    </html>
  </xsl:template>

</xsl:stylesheet>

これにより、次の出力が生成されます。

<!DOCTYPE html>
<html>
</html>

これが唯一の標準的な方法です。しかし、MSXSLでは、標準的ではない方法があります。空のxsl:output / @ doctype-publicとxsl:output / @ doctype-systemを使用します。

4
disable-output-escapingケーシーによって意味されていました
yegor256 '09 / 08/11

私はこのプロジェクトに取り組んでいないため、テストできません-ただし、これを賛成票に基づくベストアンサーとしてマークします。
ジョンハドレー

いつも使っています。ありがとう。
jgroenen

私を救った...ありがとう
cgatian 2015年

66

シンプルなHTML doctype <!DOCTYPE html>を使用するには、次のdisable-output-escaping機能を使用する必要があります<xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>。ただし、これdisable-output-escapingはXSLTのオプション機能であるため、XSLTエンジンまたはシリアル化パイプラインがサポートしていない場合があります。

このため、HTML5は、HTML5非対応のXSLTバージョン(つまり、XSLTの現在存在するすべてのバージョン)および同じ問題を持つ他のシステムとの互換性のための代替doctypeを提供します。代替のdoctypeは<!DOCTYPE html SYSTEM "about:legacy-compat">です。このdoctypeを出力するには、属性をまったく使用せずdoctype-system="about:legacy-compat"xsl:output要素の属性使用しdoctype-publicます。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" doctype-system="about:legacy-compat"/>
   ...
   <html>
   </html>
</xsl:stylesheet>

私はこれがおそらく私が望むものを達成するための正しい標準主導の方法であることを認めます(私はそのように支持しました)。しかし、前者はサポートされておらず(私のプロセッサーはフォールオーバーします)、後者の結果も"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"私のdoctypeになります。@Jirka Kosekが示唆したように、私のXSLTプロセッサが壊れている可能性があると思います。
Jon Hadley

1
救出(私が使用していXSLTプロセッサ)は、この問題に関するメーリングリストの議論はここにある:coactivate.org/projects/deliverance/lists/...
ジョンハドレー

1
W3Cのバリデータサービス問題の文書で始まる警告<!DOCTYPE html SYSTEM "about:legacy-compat">
エイドリアンW


20

Saxon 9.4では、以下を使用できます。

<xsl:output method="html" version="5.0" encoding="UTF-8" indent="yes" />

これは以下を生成します:

<!DOCTYPE HTML>

2
残念ながら、それはサクソンに固有です。一方、それは単にQに対する最も簡潔な回答です。これが他のXSLT 2.0プロセッサで動作するかどうか疑問に思いますか?
Paulb

これは、Saxonだけに限定されなくなり、libxslt / xsltprocソースでもサポートされるようになりました。stackoverflow.com/questions/3387127/set-html5-doctype-with-xslt/…の最後にある詳細をご覧ください。
sideshowbarker

10

doctype-publicの代わりにdoctype-systemを使用します


それはまだ"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"Doctypeに残っています。
Jon Hadley、2010

5
<xsl:output doctype-system = "about:legacy-compat" method = "html" />があなたの言うことを生成する場合、使用するXSLTプロセッサーに間違いなくバグがあります。
Jirka Kosek、2010

この動作はどこに指定されていますか?これは間違いなくJAXP XSLTでは機能しません。
rustyx

xml.apache.org/xalan-jこれは、あなたが期待しているものに近いところはありません-おそらく年齢だけです。
PandaWood 2016年

9

あなたはしなければならないあなたがHTML5とXHTML出力が一貫したい場合のlibxml2のXMLシリアライザは、出力が互換性のXHTML、(例えばあることを保証XHTML 1.0文書型によってトリガ特殊な出力モードあり、DOCTYPEとして厳格なXHTML 1.0を使用する<br />のではなく<br/><div></div>むしろよりを<div/>)。この互換モードをトリガーdoctype-system="about:legacy-compat"しませ

あなたがhtml出力に満足しているなら、設定<xsl:output method="html">は正しいことをするはずです。その後、でdoctypeを設定できますが<xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>、XDVはまだこれをサポートしていないため、適切な場所に配管する必要があります。

実際には <xsl:output method="html"/>も実際には役に立たない -これは<br/>として出力され<br></br>ます。


6

この変化Jirka Kosekのアドバイスを経由して、高度なXDVのテーマPlone.orgはで私のために働くようだcollective.xdv

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output
      doctype-public="HTML"
      doctype-system=""/>
</xsl:stylesheet>

1
はい、ただし0xA3の回答でコメントしたように、空の@ doctype-systemまたは@ doctype-publicは標準ではありません(また、仕様に反しています!)

5

これはコメントですが、正しい場所に配置するのに十分なカルマポイントがありません。はぁ。

私はこれがおそらく私が望むものを達成するための正しい標準主導の方法であることを認めます(私はそのように支持しました)。しかし、前者はサポートされていません(私のプロセッサーはフォールオーバーします)。後者の場合も、私のdoctype で " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd "になります。@Jirka Kosekが示唆したように、私のXSLTプロセッサが壊れている可能性があると思います。

いいえ、XSLTプロセッサは壊れていません。XDVが追加するだけです。

<xsl:output method="xml" indent="no" omit-xml-declaration="yes" media-type="text/html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

デフォルトでは、1秒を追加しても<xsl:output doctype-system="about:legacy-compat"/>、前のバージョンdoctype-publicは上書きされません。

XHTML 1.0 strictは廃止された許可されたdoctype stringとしてリストされているため、このdoctypeを使用してHTML5と呼んでも問題ありません。


XSLTプロセッサーがスタイルシートに要素を追加するか、いくつかの非標準属性のデフォルト値がある場合、それは壊れていることを意味します。

6
@Alejandro:XDV(現在の名前はdiazoに変更)はXSLTプロセッサーではなく、テーマ-> XSLTコンパイラーです。コンパイルされたXSLTにデフォルト値を追加するのはXDVです。私はそれを書いたので私はこれを知っています;)
ローレンス・ロウ

3

リンクを提供するだけで申し訳ありませんが、これはWHATWGグループの間で議論されましたが、私がそれに対処してから何ヶ月も経ちました。イアン・ヒクソンと、いくつかのXMLの専門家は、この議論ここで:
http://lists.w3.org/Archives/Public/public-html/2009Jan/0640.html
http://markmail.org/message/64aykbbsfzlbidzlを
、ここで実際の問題です番号:
http : //www.w3.org/html/wg/tracker/issues/54
そしてここにこの議論があり
ますhttp://www.contentwithstyle.co.uk/content/xslt-and-html-5-problems


2

このタグを使用

<xsl:output method="xml" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="XSLT-compat" indent="yes"/>

1

次のコードは、として保存した場合、スタンドアロンテンプレートとして機能しhtml5.xmlます。

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="html5.xml"?>
<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"
            >
<xsl:output method="xml" encoding="utf-8" version="" indent="yes" standalone="no" media-type="text/html" omit-xml-declaration="no" doctype-system="about:legacy-compat" />

<xsl:template match="xsl:stylesheet">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="/">
  <html>
    <head>
      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    </head>
    <body>
      <xsl:text>hi</xsl:text>
    </body>
  </html>
</xsl:template>

</xsl:stylesheet>

参考文献


1

それは私が互換性のあるhtml5 doctypeを生成するために使用するものです(saxons html5を取得し、そうでなければレガシーなことをします)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.w3.org/TR/REC-html40">

    <xsl:output
        method="html"
        version="5.0"
        doctype-system="about:legacy-compat"
        encoding="UTF-8"
        indent="yes" />
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.