Atur HTML5 doctype dengan XSLT

134

Bagaimana saya mengatur dokumen dengan rapi ke HTML5 <!DOCTYPE html>melalui XSLT (dalam hal ini dengan kolektif.xdv )

Berikut ini, yang merupakan foo Google terbaik yang dapat saya temukan:

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

menghasilkan:

<!DOCTYPE html PUBLIC "XSLT-compat" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Jon Hadley
sumber
7
Kebetulan, menggunakan PUBLIC "XSLT-compat" sudah usang. Doctype HTML5 yang kompatibel dengan XSLT sekarang <! DOCTYPE HTML SYSTEM "about: legacy-compat">. Lihat dev.w3.org/html5/spec/syntax.html#doctype-legacy-string
Alohci
1
Dari WD Editor terakhir, sepertinya hampir semua dokumen diizinkan: pendek <!DOCTYPE html>, lama <!DOCTYPE HTML SYSTEM "about:legacy-compat">dan usang ("tidak boleh") HTML 4, HTML 4.01, XHTML 1.0 dan XHTML 1.1 (semua DTD ketat ketika ada SISTEM).
1
Harap perbarui beberapa jawaban untuk HTML5 sebagai (saat ini) rekomendasi W3C.
Peter Krauss

Jawaban:

147

Saya pikir ini saat ini hanya didukung oleh penulisan DOCTYPE sebagai teks:

<?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>

Ini akan menghasilkan output berikut:

<!DOCTYPE html>
<html>
</html>
Dirk Vollmar
sumber
Ini adalah satu-satunya cara standar. Tetapi, dengan MSXSL, ada cara non standar: gunakan xsl kosong: output / @ doctype-public dan xsl: output / @ doctype-system.
4
disable-output-escapingdimaksud oleh Casey
yegor256
Saya tidak lagi mengerjakan proyek ini, jadi tidak dapat menguji - namun, menandai ini sebagai jawaban terbaik berdasarkan suara terbanyak.
Jon Hadley
Saya menggunakan ini sepanjang waktu. Terima kasih.
jgroenen
Menyelamatkan saya ... Terima kasih
cgatian
66

Untuk menggunakan DOCTYPE HTML sederhana <!DOCTYPE html>, Anda harus menggunakan disable-output-escapingfitur: <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>. Namun, disable-output-escapingmerupakan fitur opsional di XSLT, jadi mesin XSLT atau pipa serialisasi Anda mungkin tidak mendukungnya.

Untuk alasan ini, HTML5 menyediakan DOCTYPE alternatif untuk kompatibilitas dengan versi XSLT HTML5-unaware (yaitu semua versi XSLT saat ini ada) dan sistem lain yang memiliki masalah yang sama. DOCTYPE alternatif adalah <!DOCTYPE html SYSTEM "about:legacy-compat">. Untuk menampilkan doctype ini, gunakan atribut doctype-system="about:legacy-compat"pada xsl:outputelemen tanpa menggunakan doctype-publicatribut sama sekali.

<?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>
hsivonen
sumber
Saya menghargai ini mungkin cara yang benar, standar yang didorong untuk mencapai apa yang saya inginkan (saya telah meningkatkannya seperti itu). Tapi yang pertama tidak didukung (prosesor saya jatuh) dan yang terakhir masih menghasilkan "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"doctype saya. Seperti yang disarankan @Jirka Kosek, saya pikir prosesor XSLT saya mungkin rusak.
Jon Hadley
1
Pembebasan (prosesor XSLT yang saya gunakan) diskusi milis mengenai masalah ini ada di sini: coactivate.org/projects/deliverance/lists/…
Jon Hadley
1
Layanan validator w3c mengeluarkan peringatan saat dokumen dimulai dengan<!DOCTYPE html SYSTEM "about:legacy-compat">
Adrian W
30
<xsl:output
     method="html"
     doctype-system="about:legacy-compat"
     encoding="UTF-8"
     indent="yes" />

output ini

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

ini dimodifikasi sebagai perbaikan saya ke http://ukchill.com/technology/generating-html5-using-xslt/

Jim Michaels
sumber
1
Layanan validator w3c mengeluarkan peringatan saat dokumen dimulai dengan<!DOCTYPE html SYSTEM "about:legacy-compat">
Adrian W
20

Dengan Saxon 9.4 Anda dapat menggunakan:

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

Ini menghasilkan:

<!DOCTYPE HTML>
stephanme
sumber
2
Sayangnya, ini khusus untuk Saxon. Di sisi lain, itu hanyalah jawaban yang paling ringkas untuk Q. Saya ingin tahu apakah ini bekerja dengan prosesor XSLT 2.0 lainnya?
Paulb
Ini sekarang tidak lagi spesifik hanya untuk Saxon tetapi juga didukung di sumber libxslt / xsltproc. Lihat detail di akhir stackoverflow.com/questions/3387127/set-html5-doctype-with-xslt/…
sontonbarker
10

Gunakan doctype-system sebagai ganti doctype-public

Jirka Kosek
sumber
Itu masih tersisa "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"di DOCTYPE.
Jon Hadley
5
jika <xsl: output doctype-system = "about: legacy-compat" method = "html" /> menghasilkan apa yang Anda katakan, maka ada bug yang pasti dalam prosesor XSLT Anda yang Anda gunakan.
Jirka Kosek
Di mana perilaku ini ditentukan? Ini jelas tidak bekerja di JAXP XSLT.
rustyx
xml.apache.org/xalan-j yang ini tidak memberikan apa pun yang Anda harapkan - mungkin hanya usia.
PandaWood
9

Anda harus menggunakan XHTML 1.0 Strict sebagai doctype jika Anda ingin keluaran XHTML konsisten dengan HTML5, serializer libxml2's xml memiliki mode keluaran khusus yang dipicu oleh XHTML 1.0 doctypes yang memastikan bahwa output kompatibel dengan XHTML, (misal <br />alih-alih daripada <br/>, <div></div>bukan <div/>). doctype-system="about:legacy-compat"tidak tidak memicu modus kompatibilitas ini

Jika Anda senang dengan output html, maka pengaturan <xsl:output method="html">harus melakukan hal yang benar. Anda kemudian dapat mengatur DOCTYPE dengan <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>, meskipun ini perlu pipa masuk di tempat yang tepat karena XDV belum mendukung ini.

Bahkan sepertinya <xsl:output method="html"/>tidak terlalu membantu - ini akan menghasilkan <br/>keluaran sebagai <br></br>.

Laurence Rowe
sumber
6

Variasi saran Jirka Kosek ini , melalui tema Advanced XDV di Plone.org, tampaknya bekerja untuk saya di kolektif.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>
Jon Hadley
sumber
1
Ya, tetapi seperti yang telah saya komentari dalam jawaban 0xA3, kosong @ doctype-system atau @ doctype-public bukan standar (juga, itu melanggar spesifikasi!)
5

Ini adalah komentar, tetapi saya tidak memiliki cukup poin karma untuk meletakkannya di tempat yang benar. Mendesah.

Saya menghargai ini mungkin cara yang benar, standar yang didorong untuk mencapai apa yang saya inginkan (saya telah meningkatkannya seperti itu). Tapi yang pertama tidak didukung (prosesor saya jatuh) dan yang terakhir masih menghasilkan " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " di doctype saya. Seperti yang disarankan @Jirka Kosek, saya pikir prosesor XSLT saya mungkin rusak.

Tidak, prosesor XSLT Anda tidak rusak, hanya saja XDV menambahkan:

<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"/>

secara default, jadi ketika Anda menambahkan satu detik <xsl:output doctype-system="about:legacy-compat"/>yang sebelumnya doctype-publictidak ditimpa.

Perhatikan bahwa XHTML 1.0 ketat terdaftar sebagai string doctype diizinkan yang usang , sehingga sangat dapat diterima untuk menggunakan doctype ini dan masih menyebutnya HTML5.

Laurence Rowe
sumber
Jika prosesor XSLT Anda menambahkan elemen ke stylesheet Anda atau memiliki beberapa nilai standar atribut non-standar, itu berarti itu rusak.
6
@Alejandro: XDV (sekarang berganti nama diazo) bukan prosesor XSLT, itu adalah tema -> kompiler XSLT. Ini adalah XDV yang menambahkan nilai default ke dalam XSLT yang dikompilasi. Saya tahu ini karena saya menulisnya;)
Laurence Rowe
3

Maaf hanya memberikan tautan tetapi ini sudah dibahas di antara kelompok WHATWG tetapi sudah berbulan-bulan sejak saya mengatasinya. Di sini Ian Hickson dan beberapa pakar XML mendiskusikan hal ini:
http://lists.w3.org/Archives/Public/public-html/2009Jan/0640.html
http://markmail.org/message/64aykbbsfzlbidzl
dan ini adalah masalah sebenarnya nomor:
http://www.w3.org/html/wg/tracker/issues/54
dan inilah diskusi ini
http://www.contentwithstyle.co.uk/content/xslt-and-html-5-problems

rampok
sumber
2

Gunakan tag ini

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

Kode berikut akan berfungsi sebagai templat mandiri jika disimpan sebagai 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>

Referensi

Paul Sweatte
sumber
1

itulah yang saya gunakan untuk menghasilkan doctype html5 yang kompatibel (mengeluarkan saxons html5, jika tidak melakukan hal legacy)

<?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" />
BananaAcid
sumber