ตั้งค่าหลัก HTML5 ด้วย XSLT


135

ฉันจะทำอย่างไรหมดจดกำหนดประเภทเอกสารของไฟล์เป็น HTML5 ที่<!DOCTYPE html>ผ่าน XSLT (ในกรณีนี้กับ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">

7
อนึ่งการใช้ "XSLT-compat" ของ PUBLIC ล้าสมัย เอกสารประเภท HTML5 ที่เข้ากันได้กับ XSLT คือ <! DOCTYPE HTML SYSTEM "about: legacy-compat"> ดูdev.w3.org/html5/spec/syntax.html#doctype-legacy-string
Alohci

1
จาก Editor WD ครั้งล่าสุดดูเหมือนว่าจะอนุญาตให้ใช้ประเภทหลักได้เกือบทั้งหมด: สั้น<!DOCTYPE html>แบบเดิม<!DOCTYPE HTML SYSTEM "about:legacy-compat">และล้าสมัย ("ไม่ควร") HTML 4, HTML 4.01, XHTML 1.0 และ XHTML 1.1 (DTD ที่เข้มงวดทั้งหมดเมื่อมี SYSTEM)

1
โปรดอัปเดตคำตอบสำหรับ HTML5 เป็นคำแนะนำ W3C (ปัจจุบัน)
Peter Krauss

คำตอบ:


147

ฉันคิดว่าสิ่งนี้ได้รับการสนับสนุนโดยการเขียนประเภทหลักเป็นข้อความเท่านั้น:

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

นี่เป็นวิธีเดียวที่เป็นมาตรฐาน แต่สำหรับ MSXSL มีวิธีที่ไม่เป็นมาตรฐาน: ใช้ xsl ว่าง: output / @ doctype-public และ xsl: output / @ doctype-system

4
disable-output-escapingได้รับความหมายโดย Casey
yegor256

ฉันไม่ได้ทำงานในโครงการนี้อีกต่อไปจึงไม่สามารถทดสอบได้ - อย่างไรก็ตามการทำเครื่องหมายนี้เป็นคำตอบที่ดีที่สุดโดยพิจารณาจากคะแนนโหวต
Jon Hadley

ฉันใช้สิ่งนี้ตลอดเวลา ขอบคุณ.
jgroenen

บันทึกฉันไว้ ... ขอบคุณ
cgatian

66

หากต้องการใช้ประเภทเอกสาร HTML ง่ายๆ<!DOCTYPE html>ที่คุณต้องใช้คุณลักษณะ:disable-output-escaping <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>อย่างไรก็ตามdisable-output-escapingเป็นคุณสมบัติเสริมใน XSLT ดังนั้นเอ็นจิ้น XSLT หรือไปป์ไลน์การทำให้เป็นอนุกรมของคุณอาจไม่รองรับ

ด้วยเหตุนี้ HTML5 จึงจัดเตรียมประเภทอื่นสำหรับความเข้ากันได้กับเวอร์ชัน XSLT ที่ไม่ทราบ HTML5 (เช่น XSLT เวอร์ชันที่มีอยู่ทั้งหมดในปัจจุบัน) และระบบอื่น ๆ ที่มีปัญหาเดียวกัน DOCTYPE <!DOCTYPE html SYSTEM "about:legacy-compat">ที่ทางเลือกคือ ในการแสดงผลประเภทนี้ให้ใช้แอตทริบิวต์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>

ฉันขอขอบคุณที่นี่อาจเป็นวิธีที่ถูกต้องและได้รับการขับเคลื่อนตามมาตรฐานเพื่อให้บรรลุสิ่งที่ฉันต้องการ (ฉันโหวตให้แล้ว) แต่ก่อนหน้านี้ไม่ได้รับการสนับสนุน (โปรเซสเซอร์ของฉันล้มลง) และผลลัพธ์ยังคงอยู่"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"ในประเภทหลักของฉัน ตามที่ @Jirka Kosek แนะนำฉันคิดว่าโปรเซสเซอร์ XSLT ของฉันอาจเสีย
Jon Hadley

1
Deliverance (ตัวประมวลผล XSLT ที่ฉันใช้) การอภิปรายรายชื่ออีเมลเกี่ยวกับปัญหานี้อยู่ที่นี่: coactivate.org/projects/deliverance/lists/…
Jon Hadley

1
บริการตรวจสอบ W3Cออกคำเตือนเมื่อเอกสารที่เริ่มต้นด้วย<!DOCTYPE html SYSTEM "about:legacy-compat">
เอเดรีย W

30
<xsl:output
     method="html"
     doctype-system="about:legacy-compat"
     encoding="UTF-8"
     indent="yes" />

ผลลัพธ์นี้

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

นี่คือการแก้ไขของฉันเพื่อแก้ไขhttp://ukchill.com/technology/generating-html5-using-xslt/


1
บริการตรวจสอบ W3Cออกคำเตือนเมื่อเอกสารที่เริ่มต้นด้วย<!DOCTYPE html SYSTEM "about:legacy-compat">
เอเดรีย W

20

ด้วย Saxon 9.4 คุณสามารถใช้:

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

สิ่งนี้สร้าง:

<!DOCTYPE HTML>

2
น่าเสียดายที่เป็นเฉพาะสำหรับแซกซอน ในทางกลับกันมันเป็นเพียงคำตอบที่กระชับที่สุดสำหรับ Q ฉันสงสัยว่ามันใช้ได้กับโปรเซสเซอร์ XSLT 2.0 อื่น ๆ หรือไม่?
Paulb

ตอนนี้สิ่งนี้ไม่ได้เฉพาะเจาะจงสำหรับแซกซอนอีกต่อไป แต่ยังรองรับในแหล่ง libxslt / xsltproc ด้วย ดูรายละเอียดท้ายstackoverflow.com/questions/3387127/set-html5-doctype-with-xslt/…
sideshowbarker

10

ใช้ระบบหลักประเภทวิชาแทนที่จะเป็นแบบสาธารณะ


ที่ยังคงมี"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"อยู่ในประเภทหลัก
Jon Hadley

5
ถ้า <xsl: output doctype-system = "about: legacy-compat" method = "html" /> สร้างสิ่งที่คุณพูดแสดงว่ามีข้อบกพร่องอย่างชัดเจนในโปรเซสเซอร์ XSLT ที่คุณใช้
Jirka Kosek

พฤติกรรมนี้ระบุไว้ที่ไหน? สิ่งนี้ใช้ไม่ได้กับ JAXP XSLT
rustyx

xml.apache.org/xalan-jสิ่งนี้ไม่ให้สิ่งที่คุณคาดหวัง - อาจเป็นเพียงอายุ
PandaWood

10

คุณต้องใช้ XHTML 1.0 Strict เป็นประเภทเอกสารที่ถ้าคุณต้องการส่งออก XHTML สอดคล้องกับ HTML5, libxml2 ของ serializer XML มีโหมดการส่งออกพิเศษเรียกโดย XHTML 1.0 doctypes เพื่อให้แน่ใจว่าการส่งออกเป็น XHTML เข้ากันได้ (เช่น<br />มากกว่า<br/>, <div></div>มากกว่า<div/>) doctype-system="about:legacy-compat"ไม่ได้เรียกโหมดที่เข้ากันนี้

หากคุณพอใจกับเอาต์พุต html การตั้งค่า<xsl:output method="html">ควรทำในสิ่งที่ถูกต้อง จากนั้นคุณสามารถตั้งค่าประเภทหลักได้<xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>แม้ว่าจะต้องวางท่อประปาในตำแหน่งที่เหมาะสมเนื่องจาก XDV ยังไม่รองรับสิ่งนี้

ในความเป็นจริงมันก็ดูเหมือน<xsl:output method="html"/>ไม่ได้จริงๆช่วยทั้ง - นี้จะส่งผลในการเป็นออกเป็น<br/><br></br>


6

รูปแบบนี้ของคำแนะนำ Jirka Kosek ของผ่านทางขั้นสูง XDV themingบน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>

1
ใช่ แต่ตามที่ฉันได้แสดงความคิดเห็นในคำตอบ 0xA3 แล้ว @ Doctype-system หรือ @ doctype-public ที่ว่างเปล่าไม่ได้เป็นมาตรฐาน (เช่นกันมันผิดข้อกำหนด!)

5

นี่เป็นความคิดเห็น แต่ฉันไม่มีจุดกรรมเพียงพอที่จะวางไว้ในที่ที่ถูกต้อง เฮ้อ.

ฉันขอขอบคุณที่นี่อาจเป็นวิธีที่ถูกต้องและได้รับการขับเคลื่อนตามมาตรฐานเพื่อให้บรรลุสิ่งที่ฉันต้องการ (ฉันโหวตให้แล้ว) แต่ก่อนหน้านี้ไม่ได้รับการสนับสนุน (โปรเซสเซอร์ของฉันล้มลง) และผลลัพธ์ยังคงเป็น " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " ในประเภทหลักของฉัน ตามที่ @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"/>

ตามค่าเริ่มต้นดังนั้นเมื่อคุณเพิ่มวินาที<xsl:output doctype-system="about:legacy-compat"/>ก่อนหน้านี้doctype-publicจะไม่ถูกเขียนทับ

โปรดทราบว่า XHTML 1.0 เข้มงวดถูกระบุว่าเป็นสตริงประเภทหลักที่ได้รับอนุญาตที่ล้าสมัยดังนั้นจึงเป็นที่ยอมรับอย่างสมบูรณ์ที่จะใช้ประเภทหลักนี้และยังคงเรียกว่า HTML5


หากโปรเซสเซอร์ XSLT ของคุณเพิ่มองค์ประกอบให้กับสไตล์ชีตของคุณหรือมีค่าเริ่มต้นของแอตทริบิวต์ที่ไม่ได้มาตรฐานนั่นหมายความว่ามันเสีย

6
@Alejandro: XDV (เปลี่ยนชื่อเป็น diazo แล้ว) ไม่ใช่โปรเซสเซอร์ XSLT เป็นธีม -> คอมไพเลอร์ XSLT เป็น XDV ซึ่งเพิ่มค่าเริ่มต้นลงใน XSLT ที่คอมไพล์แล้ว ฉันรู้สิ่งนี้เพราะฉันเขียนมัน;)
Laurence Rowe

3

ขออภัยที่ให้เฉพาะลิงค์ แต่มีการพูดคุยกันในกลุ่ม 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-pro issues



1

รหัสต่อไปนี้จะทำงานเป็นเทมเพลตแบบสแตนด์อโลนหากบันทึกเป็น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

นั่นคือสิ่งที่ฉันใช้ในการสร้าง 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" />
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.