web-dev-qa-db-ja.com

XSLTでHTML5 doctypeを設定します

どのようにすればcleanlyXSLTを介してファイルの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">
132
Jon Hadley

これは現在、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>
145
Dirk Vollmar

シンプルな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>
63
hsivonen
<xsl:output
     method="html"
     doctype-system="about:legacy-compat"
     encoding="UTF-8"
     indent="yes" />

この出力

<!DOCTYPE html SYSTEM "about:legacy-compat">

これは http://ukchill.com/technology/generated-html5-using-xslt/ に対する修正として修正されます

30
Jim Michaels

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

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

これにより以下が生成されます。

<!DOCTYPE HTML>
19
stephanme

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

10
Jirka Kosek

必須 XHTML出力をHTML5との整合性が必要な場合は、XHTML 1.0 Strictをdoctypeとして使用します。libxml2のxmlシリアライザーには、XHTML互換性を保証するXHTML 1.0 Doctypeによってトリガーされる特別な出力モードがあります(例:<br /><br/>ではなく、<div></div>ではなく<div/>)。 doctype-system="about:legacy-compat"notこの互換モードをトリガーします

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

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

8
Laurence Rowe

Jirka Kosekのアドバイス のこのバリエーションは Advanced XDV theming on 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>
6
Jon Hadley

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

私はこれがおそらく、私が望むことを達成するための正しい、標準主導の方法であることを感謝しています(私はそのようにそれを支持しました)。しかし、前者はサポートされておらず(私のプロセッサは転倒します)、後者は依然として「 http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd 」になります私のDoctype。 @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"/>

デフォルトでは、2番目の<xsl:output doctype-system="about:legacy-compat"/>を追加しても、以前のdoctype-publicは上書きされません。

XHTML 1.0 strictは 旧式の許可されたdoctype文字列 としてリストされていることに注意してください。

5
Laurence Rowe

リンクのみを提供して申し訳ありませんが、これはWHATWGグループ間で議論されましたが、私がそれを扱ってから何ヶ月も経ちました。ここで、Ian Hicksonといくつかの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

3
Rob

このタグを使用

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

次のコードは、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
Paul Sweatte

それは、互換性のあるhtml5 doctypeを生成するために使用するものです(サクソン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" />
1
BananaAcid