Imposta doctype HTML5 con XSLT


134

Come imposto in modo chiaro il doctype di un file su HTML5 <!DOCTYPE html>tramite XSLT (in questo caso con collective.xdv )

Quanto segue, che è il migliore che il mio foo di Google è stato in grado di trovare:

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

produce:

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

7
Per inciso, l'utilizzo di PUBLIC "XSLT-compat" non è aggiornato. Il doctype HTML5 compatibile con XSLT è ora <! DOCTYPE HTML SYSTEM "about: legacy-compat">. Vedi dev.w3.org/html5/spec/syntax.html#doctype-legacy-string
Alohci

1
Dall'ultimo Editor WD, sembra che sia consentito quasi ogni tipo di documento: breve <!DOCTYPE html>, legacy <!DOCTYPE HTML SYSTEM "about:legacy-compat">e obsoleto ("non dovrebbe") HTML 4, HTML 4.01, XHTML 1.0 e XHTML 1.1 (tutto DTD rigoroso quando c'è SISTEMA).

1
Aggiorna alcune risposte a HTML5 come (al giorno d'oggi) raccomandazione del W3C.
Peter Krauss,

Risposte:


147

Penso che questo sia attualmente supportato solo scrivendo il doctype come testo:

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

Ciò produrrà il seguente output:

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

Questo è l'unico modo standar. Ma, con MSXSL, esiste un modo non standard: usa xsl: output / @ doctype-public e xsl: output / @ doctype-system vuoti.

4
disable-output-escapingfu inteso da Casey
yegor256

Non sto più lavorando a questo progetto, quindi incapace di testarlo, tuttavia, contrassegnandolo come la migliore risposta basata su voti positivi.
Jon Hadley,

Lo uso sempre. Grazie.
jgroenen,

Mi hai salvato ... Grazie
cgatian

66

Per utilizzare il semplice DOCTYPE HTML <!DOCTYPE html>, è necessario utilizzare la disable-output-escapingfunzione di: <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>. Tuttavia, disable-output-escapingè una funzionalità opzionale in XSLT, quindi il tuo motore XSLT o la pipeline di serializzazione potrebbero non supportarla.

Per questo motivo, HTML5 fornisce un tipo di documento alternativo per la compatibilità con le versioni XSLT HTML5 inconsapevoli (ovvero tutte le versioni attualmente esistenti di XSLT) e altri sistemi che presentano lo stesso problema. Il tipo di documento alternativo è <!DOCTYPE html SYSTEM "about:legacy-compat">. Per questo uscita doctype, utilizzare l'attributo doctype-system="about:legacy-compat"sul xsl:outputelemento senza utilizzare un doctype-publicattributo affatto.

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

Apprezzo che questo sia probabilmente il modo corretto e guidato dagli standard per realizzare ciò che voglio (l'ho votato come tale). Ma il primo non è supportato (il mio processore cade) e il secondo risulta ancora "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"nel mio doctype. Come suggerito da @Jirka Kosek, penso che il mio processore XSLT potrebbe essere rotto.
Jon Hadley,

1
La discussione sulla mailing list di Deliverance (il processore XSLT che sto usando) su questo problema è qui: coactivate.org/projects/deliverance/lists/…
Jon Hadley

1
Il servizio di convalida w3c emette un avviso quando il documento inizia con<!DOCTYPE html SYSTEM "about:legacy-compat">
Adrian W


20

Con Saxon 9.4 puoi usare:

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

Questo genera:

<!DOCTYPE HTML>

2
Sfortunatamente, è specifico per Saxon. D'altra parte, è semplicemente la risposta più concisa al Q. Mi chiedo se questo funziona con gli altri processori XSLT 2.0?
Paulb,

Questo non è più specifico solo per Saxon ma è supportato anche nelle fonti libxslt / xsltproc. Vedi i dettagli alla fine di stackoverflow.com/questions/3387127/set-html5-doctype-with-xslt/…
sideshowbarker

10

Usa doctype-system invece di doctype-public


Ciò lascia ancora "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"nel doctype.
Jon Hadley,

5
se <xsl: output doctype-system = "about: legacy-compat" method = "html" /> produce ciò che dici, allora c'è definitivamente un bug nel tuo processore XSLT che usi.
Jirka Kosek,

Dove viene specificato questo comportamento? Questo sicuramente non funziona in JAXP XSLT.
Rustyx,

xml.apache.org/xalan-j questo non dà nulla vicino a quello che ti aspetti, forse solo l'età.
PandaWood,

9

È necessario utilizzare XHTML 1.0 Strict come il DOCTYPE, se si desidera l'uscita XHTML coerente con HTML5, xml serializzatore di libxml2 ha una modalità di uscita speciale innescata dalla XHTML 1.0 doctype che la produzione assicura è compatibile XHTML, (ad esempio, <br />piuttosto che <br/>, <div></div>piuttosto che <div/>). doctype-system="about:legacy-compat"non senza innescare questa modalità compatibilità

Se sei soddisfatto dell'output html, l'impostazione <xsl:output method="html">dovrebbe fare la cosa giusta. È quindi possibile impostare il doctype con <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>, anche se sarà necessario installarlo nel punto appropriato poiché XDV non lo supporta ancora.

In effetti sembra <xsl:output method="html"/>che non aiuti davvero neanche - questo si tradurrà in <br/>output come <br></br>.


6

Questa variazione del consiglio di Jirka Kosek , tramite il tema Advanced XDV su Plone.org sembra funzionare per me in 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
Sì, ma come ho commentato nella risposta 0xA3, @ doctype-system vuoto o @ doctype-public non sono standar (inoltre, è contro le specifiche!)

5

Questo è un commento, ma non ho abbastanza punti karma per metterlo nel posto giusto. Sospiro.

Apprezzo che questo sia probabilmente il modo corretto e guidato dagli standard per realizzare ciò che voglio (l'ho votato come tale). Ma il primo non è supportato (il mio processore cade) e il secondo risulta ancora in " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " nel mio doctype. Come suggerito da @Jirka Kosek, penso che il mio processore XSLT potrebbe essere rotto.

No, il tuo processore XSLT non è rotto, è solo che XDV aggiunge:

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

per impostazione predefinita, quindi quando aggiungi un secondo <xsl:output doctype-system="about:legacy-compat"/>il precedente doctype-publicnon viene sovrascritto.

Si noti che XHTML 1.0 strict è elencato come una stringa doctype consentita obsoleta , quindi è perfettamente accettabile usare questo doctype e chiamarlo ancora HTML5.


Se il tuo processore XSLT aggiunge elementi ai tuoi fogli di stile o ha alcuni valori predefiniti di attributo non standard, ciò significherebbe che è rotto.

6
@Alejandro: XDV (ora rinominato diazo) non è un processore XSLT, è un tema -> compilatore XSLT. È XDV che sta aggiungendo i valori predefiniti nell'XSLT compilato. Lo so perché l'ho scritto;)
Laurence Rowe,

3

Mi dispiace fornire solo collegamenti, ma questo è stato discusso tra il gruppo WHATWG, ma sono passati molti mesi da quando ci ho pensato. Qui Ian Hickson e alcuni esperti XML discutono di questo:
http://lists.w3.org/Archives/Public/public-html/2009Jan/0640.html
http://markmail.org/message/64aykbbsfzlbidzl
ed ecco il vero problema numero:
http://www.w3.org/html/wg/tracker/issues/54
ed ecco questa discussione
http://www.contentwithstyle.co.uk/content/xslt-and-html-5-problems


2

Usa questo tag

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

1

Il seguente codice funzionerà come modello autonomo se salvato come 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>

Riferimenti


1

è quello che uso per generare un doctype html5 compatibile (far uscire i sassoni html5, altrimenti fare la cosa 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" />
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.