Definir doctype HTML5 com XSLT

134

Como eu definiria corretamente o doctype de um arquivo para HTML5 <!DOCTYPE html>via XSLT (neste caso, com o arquivo colectivo.xdv )

A seguir, qual é o melhor que meu Google Foo conseguiu encontrar:

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

produz:

<!DOCTYPE html PUBLIC "XSLT-compat" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Jon Hadley
fonte
7
Aliás, o uso de PUBLIC "XSLT-compat" está desatualizado. O doctype HTML5 compatível com XSLT agora é <! DOCTYPE HTML SYSTEM "about: legacy-compat">. Veja dev.w3.org/html5/spec/syntax.html#doctype-legacy-string
Alohci
1
A partir do último Editor WD, parece que quase qualquer tipo de documento é permitido: curto <!DOCTYPE html>, herdado <!DOCTYPE HTML SYSTEM "about:legacy-compat">e obsoleto ("não deveria") HTML 4, HTML 4.01, XHTML 1.0 e XHTML 1.1 (todos DTD estritos quando existe SISTEMA).
1
Atualize algumas respostas para HTML5 como (atualmente) recomendação do W3C.
Peter Krauss

Respostas:

147

Eu acho que isso atualmente é suportado apenas escrevendo o doctype como texto:

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

Isso produzirá a seguinte saída:

<!DOCTYPE html>
<html>
</html>
Dirk Vollmar
fonte
Este é o único caminho padrão. Mas, com o MSXSL, existe uma maneira não padronizada: use xsl: output / @ doctype-public vazio e xsl: output / @ doctype-system vazio.
4
disable-output-escapingse entende por Casey
yegor256
Não estou mais trabalhando neste projeto, portanto, não posso testar - no entanto, marcar isso como a melhor resposta com base em votos positivos.
9134 Jon Hadley
Eu uso isso o tempo todo. Obrigado.
jgroenen
Salva-me ... Obrigado
cgatian
66

Para usar o simples doctype HTML <!DOCTYPE html>, você tem que usar o disable-output-escapingrecurso: <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>. No entanto, disable-output-escapingé um recurso opcional no XSLT, portanto, o mecanismo XSLT ou o pipeline de serialização talvez não o suporte.

Por esse motivo, o HTML5 fornece um tipo de documento alternativo para compatibilidade com versões XSLT desconhecidas por HTML5 (ou seja, todas as versões atualmente existentes do XSLT) e outros sistemas com o mesmo problema. O doctype alternativo é <!DOCTYPE html SYSTEM "about:legacy-compat">. Para gerar esse doctype, use o atributo doctype-system="about:legacy-compat"no xsl:outputelemento sem usar nenhum doctype-publicatributo.

<?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
fonte
Aprecio que esta é provavelmente a maneira correta e orientada por padrões para realizar o que quero (eu a votei como tal). Mas o primeiro não é suportado (meu processador cai) e o último ainda resulta "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"no meu doctype. Como sugeriu @Jirka Kosek, acho que meu processador XSLT pode estar quebrado.
Jon Hadley
1
Deliverance (o processador XSLT Eu estou usando) mailing list discussão sobre este problema está aqui: coactivate.org/projects/deliverance/lists/...
Jon Hadley
1
O serviço W3C validador emite um aviso quando o documento começa com<!DOCTYPE html SYSTEM "about:legacy-compat">
Adrian W
20

Com o Saxon 9.4, você pode usar:

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

Isso gera:

<!DOCTYPE HTML>
stephanme
fonte
2
Infelizmente, é específico para o saxão. Por outro lado, é simplesmente a resposta mais concisa para o Q. Gostaria de saber se isso funciona com os outros processadores XSLT 2.0?
paulb
Agora isso não é mais específico apenas para o Saxon, mas também é suportado nas fontes libxslt / xsltproc. Veja os detalhes no final de stackoverflow.com/questions/3387127/set-html5-doctype-with-xslt/… #
sideshowbarker
10

Use doctype-system em vez de doctype-public

Jirka Kosek
fonte
Isso ainda deixa "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"no doctype.
Jon Hadley
5
se <xsl: output doctype-system = "about: legacy-compat" method = "html" /> produz o que você diz, então há definitivamente um erro no seu processador XSLT que você usa.
Jirka Kosek
Onde esse comportamento é especificado? Definitivamente, isso não funciona no JAXP XSLT.
Rustyx
xml.apache.org/xalan-j este não chega nem perto do que você espera - talvez apenas a idade.
PandaWood
9

Você deve usar XHTML 1.0 Strict como o doctype se você quiser saída XHTML compatível com HTML5, serializador xml do libxml2 tem um modo de saída especial desencadeada pelo XHTML 1.0 doctypes que garante saída é compatível com XHTML, (por exemplo, <br />ao invés de <br/>, <div></div>em vez de <div/>). doctype-system="about:legacy-compat"se não desencadear este modo de compatibilidade

Se você está satisfeito com a saída html, a configuração <xsl:output method="html">deve fazer a coisa certa. Você pode definir o doctype com <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>, embora isso precise ser canalizado no local apropriado, pois o XDV ainda não suporta isso.

De fato, parece que <xsl:output method="html"/>também não ajuda muito - isso resultará em <br/>uma saída como <br></br>.

Laurence Rowe
fonte
6

Essa variação do conselho de Jirka Kosek , através do tema Advanced XDV no Plone.org, parece funcionar para mim no coletivo.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
fonte
1
Sim, mas como eu já comentou em resposta 0xA3, vazio @ doctype-sistema ou @ doctype-pública não são standar (também, é contra a especificação!)
5

Este é um comentário, mas não tenho pontos de carma suficientes para colocá-lo no lugar correto. Suspiro.

Aprecio que essa é provavelmente a maneira correta e orientada por padrões para realizar o que eu quero (eu a votei como tal). Mas o primeiro não é suportado (meu processador cai) e o segundo ainda resulta em " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " no meu doctype. Como sugeriu @Jirka Kosek, acho que meu processador XSLT pode estar quebrado.

Não, seu processador XSLT não está quebrado, apenas o XDV adiciona:

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

por padrão, portanto, quando você adiciona um segundo, <xsl:output doctype-system="about:legacy-compat"/>o anterior doctype-publicnão é substituído.

Observe que o XHTML 1.0 strict está listado como uma seqüência de caracteres doctype permitida obsoleta , portanto, é perfeitamente aceitável usar esse doctype e ainda chamá-lo de HTML5.

Laurence Rowe
fonte
Se o seu processador XSLT adicionar elementos às suas folhas de estilo ou possuir alguns valores padrão de atributo não-padrão, isso significa que está quebrado.
6
@Alejandro: XDV (agora renomeado diazo) não é um processador XSLT, é um tema -> compilador XSLT. É o XDV que está adicionando os valores padrão ao XSLT compilado. Eu sei disso porque eu o escrevi;)
Laurence Rowe
3

Desculpe por fornecer apenas links, mas isso foi discutido entre o grupo WHATWG, mas já se passaram muitos meses desde que eu lidei com isso. Aqui Ian Hickson e alguns especialistas em XML discutem isso:
http://lists.w3.org/Archives/Public/public-html/2009Jan/0640.html
http://markmail.org/message/64aykbbsfzlbidzl
e aqui está o problema real número:
http://www.w3.org/html/wg/tracker/issues/54
e aqui está essa discussão
http://www.contentwithstyle.co.uk/content/xslt-and-html-5-problems

Roubar
fonte
2

Use esta tag

<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
fonte
1

O código a seguir funcionará como um modelo autônomo se salvo como 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>

Referências

Paul Sweatte
fonte
1

é isso que eu uso para gerar um doctype html5 compatível (obter saxões html5, caso contrário, fazer a coisa herdada)

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