XSLT ile HTML5 dokümanı ayarlama


134

XSLT aracılığıyla bir dosyanın doktrasını HTML5'e nasıl temiz bir şekilde ayarlayabilirim <!DOCTYPE html>(bu durumda collective.xdv ile )

Google foo'mun bulabileceği en iyisi olan aşağıdakiler:

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

üretir:

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

7
Bu arada, PUBLIC "XSLT-compat" kullanımı güncel değil. XSLT uyumlu HTML5 doktipi artık <! DOCTYPE HTML SYSTEM "about: legacy-compat">. Bkz. Dev.w3.org/html5/spec/syntax.html#doctype-legacy-string
Alohci

1
Son Editör WD'den, neredeyse her dokümana izin veriliyor gibi görünüyor: kısa <!DOCTYPE html>, eski <!DOCTYPE HTML SYSTEM "about:legacy-compat">ve eski ("olmamalı") HTML 4, HTML 4.01, XHTML 1.0 ve XHTML 1.1 (SİSTEM olduğunda tümü katı DTD).

1
Lütfen HTML5 için bazı yanıtları (günümüzde) W3C önerisi olarak güncelleyin.
Peter Krauss

Yanıtlar:


147

Bence bu şu anda sadece dokümanı metin olarak yazarak destekleniyor:

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

Bu, aşağıdaki çıktıyı üretecektir:

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

Bu tek standart yoldur. Ancak, MSXSL ile standart olmayan bir yol vardır: boş xsl: output / @ doctype-public ve xsl: output / @ doctype-system kullanın.

4
disable-output-escapingCasey demekti
yegor256

Artık bu proje üzerinde çalışmıyorum, bu yüzden test edemiyorum - ancak bunu yukarı oylara dayalı en iyi cevap olarak işaretliyorum.
Jon Hadley

Bunu her zaman kullanıyorum. Teşekkürler.
jgroenen

Kurtardım ... Teşekkür ederim
cgatian

66

Basit HTML belgesini <!DOCTYPE html>kullanmak için disable-output-escaping: özelliğini kullanmanız gerekir <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>. Ancak, disable-output-escapingbir olan isteğe bağlı bir özelliktir XSLT'de, bu nedenle XSLT motoru veya seri boru hattı bunu desteklemeyebilir.

Bu nedenle HTML5, HTML5'ten habersiz XSLT sürümleriyle (yani, şu anda var olan tüm XSLT sürümleriyle) ve aynı soruna sahip diğer sistemlerle uyumluluk için alternatif bir doküman türü sağlar. Alternatif öğretidir <!DOCTYPE html SYSTEM "about:legacy-compat">. Çıktı Bu belge türüne özelliğini kullanın doctype-system="about:legacy-compat"üzerinde xsl:outputeleman olmadan bir kullanan doctype-publichiç niteliği.

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

Bunun muhtemelen istediğimi başarmak için doğru, standartlara dayalı yol olduğunu takdir ediyorum (bu şekilde iptal ettim). Ancak birincisi desteklenmiyor (işlemcim devriliyor) ve ikincisi hala "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"benim doktuğumla sonuçlanıyor . @Jirka Kosek'in önerdiği gibi, XSLT işlemcimin bozuk olabileceğini düşünüyorum.
Jon Hadley

1
Kurtuluş (kullanıyorum XSLT işlemci) bu sorunla ilgili posta listesi tartışması burada: coactivate.org/projects/deliverance/lists/…
Jon Hadley

1
W3C doğrulayıcı hizmet bir uyarı verir zaman ile belge başlar<!DOCTYPE html SYSTEM "about:legacy-compat">
Adrian W


20

Saxon 9.4 ile şunları kullanabilirsiniz:

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

Bu şunu üretir:

<!DOCTYPE HTML>

2
Ne yazık ki, Sakson'a özgüdür. Öte yandan, bu Q'nun en özlü cevabıdır. Bunun diğer XSLT 2.0 işlemcilerle çalışıp çalışmadığını merak ediyorum.
Paulb

Artık bu sadece Saxon'a özgü değil, libxslt / xsltproc kaynaklarında da destekleniyor. Stackoverflow.com/questions/3387127/set-html5-doctype-with-xslt/…
detahowbarker

10

Doktora-kamu yerine doktip sistemini kullanın


Bu hala doktrin "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"içinde kalıyor.
Jon Hadley

5
<xsl: output doctype-system = "about: legacy-compat" method = "html" /> söylediklerinizi üretirse, kullandığınız XSLT işlemcinizde kesin bir hata vardır.
Jirka Kosek

Bu davranış nerede belirtilir? Bu kesinlikle JAXP XSLT'de çalışmaz.
rustyx

xml.apache.org/xalan-j Bu, beklediğinizin yakınında hiçbir yere vermez - belki sadece yaş.
PandaWood

9

Sen gerekir Eğer HTML5 ile XHTML çıkış tutarlı istiyorsanız doctype olarak XHTML 1.0 Strict kullanmak, libxml2 en xml seri hale getirici XHTML 1.0 belgetürleri olmasını sağlar çıktı tarafından tetiklenen özel çıkış moduna sahiptir XHTML, uyumlu (örn olduğunu <br />ziyade <br/>, <div></div>yerine <div/>). doctype-system="about:legacy-compat"yok değil bu uyumluluk modu tetiklemek

Html çıktısından memnunsanız, ayar <xsl:output method="html">doğru olanı yapmalıdır. Daha sonra <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>XDV henüz desteklemediğinden, uygun bir yerde su tesisatı gerektirecek olsa da , dokümanı da ayarlayabilirsiniz .

Aslında bu <xsl:output method="html"/>da gerçekten yardımcı olmuyor gibi görünüyor - bu <br/>çıktı olarak sonuçlanacaktır <br></br>.


6

Bu varyasyon Jirka Kosek tavsiyesine aracılığıyla, Gelişmiş XDV tema üzerinde plone.org benim için çalışıyor gibi görünüyor 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
Evet, ancak 0xA3 yanıtında yorum yaptığım gibi, boş @ doctype-system veya @ doctype-public standart değildir (ayrıca, spesifikasyona karşı!)

5

Bu bir yorum, ama doğru yere koymak için yeterli karma puanım yok. İç çekmek.

Bunun muhtemelen istediğimi başarmak için doğru, standartlara dayalı yol olduğunu takdir ediyorum (bu şekilde iptal ettim). Ancak birincisi desteklenmiyor (işlemcim devriliyor) ve ikincisi yine de doktuğumda " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " ile sonuçlanıyor . @Jirka Kosek'in önerdiği gibi, XSLT işlemcimin bozuk olabileceğini düşünüyorum.

Hayır, XSLT işlemciniz bozulmamış, sadece XDV'nin eklediği:

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

Varsayılan olarak, bu nedenle ikinci bir eklediğinizde <xsl:output doctype-system="about:legacy-compat"/>önceki doctype-publicyazılmaz.

XHTML 1.0 katı'nın eski izin verilen bir doküman dizesi olarak listelendiğini unutmayın , bu nedenle bu dokümanı kullanmak ve yine de HTML5 olarak adlandırmak tamamen kabul edilebilir.


XSLT işlemciniz stil sayfalarınıza öğeler eklerse veya bazı standart dışı özellik varsayılan değerlerine sahipse, bu bozuk olduğu anlamına gelir.

6
@Alejandro: XDV (şimdi yeniden adlandırılmış diazo) bir XSLT işlemci değil, bir tema -> XSLT derleyicisi. Derlenmiş XSLT'ye varsayılan değerleri ekleyen XDV'dir. Bunu biliyorum çünkü yazdım;)
Laurence Rowe

3

Yalnızca bağlantı sağladığım için üzgünüm, ancak bu WHATWG grubu arasında tartışıldı, ancak bununla uğraştığımdan beri aylar geçti. İşte Ian Hickson ve bazı XML uzmanları bunu tartışıyor:
http://lists.w3.org/Archives/Public/public-html/2009Jan/0640.html
http://markmail.org/message/64aykbbsfzlbidzl
ve işte asıl sorun numarası:
http://www.w3.org/html/wg/tracker/issues/54
ve işte bu tartışma
http://www.contentwithstyle.co.uk/content/xslt-and-html-5-problems


2

Bu etiketi kullan

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

1

Aşağıdaki kod, olarak kaydedildiyse bağımsız bir şablon olarak çalışır 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>

Referanslar


1

uyumlu bir html5 doktipi oluşturmak için kullandığım şey budur (saksafon html5'i almak, aksi takdirde eski şeyi yapmak)

<?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" />
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.