Đặt loại tài liệu HTML5 với XSLT


134

Làm cách nào tôi có thể thiết lập rõ ràng loại tài liệu của tệp thành HTML5 <!DOCTYPE html>thông qua XSLT (trong trường hợp này là với collective.xdv )

Sau đây, đây là thứ tốt nhất mà Google foo của tôi có thể tìm thấy:

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

sản xuất:

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

7
Ngẫu nhiên, sử dụng PUBLIC "XSLT-compat" đã hết hạn. Loại tài liệu HTML5 tương thích XSLT hiện là <! DOCTYPE HTML HỆ THỐNG "about: legacy-compat">. Xem dev.w3.org/html5/spec/syntax.html#doctype-legacy- chuỗi
Alohci

1
Từ Trình chỉnh sửa WD cuối cùng, có vẻ như hầu hết mọi loại tài liệu đều được phép: ngắn <!DOCTYPE html>, di sản <!DOCTYPE HTML SYSTEM "about:legacy-compat">và lỗi thời ("không nên") HTML 4, HTML 4.01, XHTML 1.0 và XHTML 1.1 (tất cả DTD nghiêm ngặt khi có HỆ THỐNG).

1
Vui lòng cập nhật một số câu trả lời cho HTML5 dưới dạng (hiện tại) đề xuất W3C.
Peter Krauss

Câu trả lời:


147

Tôi nghĩ rằng điều này hiện chỉ được hỗ trợ bằng cách viết tài liệu dưới dạng văn bản:

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

Điều này sẽ tạo ra đầu ra sau đây:

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

Đây là cách duy nhất. Nhưng, với MSXSL, có một cách không độc lập: sử dụng xsl: output / @ doctype-public và xsl: output / @ doctype-system.

4
disable-output-escapingcó nghĩa là Casey
yegor256

Tôi không còn làm việc trong dự án này nữa, vì vậy không thể kiểm tra - tuy nhiên, đánh dấu đây là câu trả lời tốt nhất dựa trên số phiếu tăng.
Jon Hadley

Tôi sử dụng tất cả các thời gian. Cảm ơn.
jgroenen

Cứu tôi với ... Cảm ơn bạn
cgatian

66

Để sử dụng loại tài liệu HTML đơn giản <!DOCTYPE html>, bạn phải sử dụng disable-output-escapingtính năng : <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>. Tuy nhiên, disable-output-escapinglà một tính năng tùy chọn trong XSLT, vì vậy công cụ XSLT hoặc đường ống tuần tự hóa của bạn có thể không hỗ trợ nó.

Vì lý do này, HTML5 cung cấp một loại tài liệu thay thế để tương thích với các phiên bản XSLT không biết HTML5 (tức là tất cả các phiên bản XSLT hiện tại) và các hệ thống khác có cùng vấn đề. Các loại tài liệu thay thế là <!DOCTYPE html SYSTEM "about:legacy-compat">. Để xuất ra loại tài liệu này, hãy sử dụng thuộc tính doctype-system="about:legacy-compat"trên xsl:outputphần tử mà không sử dụng doctype-publicthuộc tính nào cả.

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

Tôi đánh giá cao đây có lẽ là cách chính xác, hướng đến tiêu chuẩn để thực hiện những gì tôi muốn (tôi đã nâng cấp nó như vậy). Nhưng cái trước không được hỗ trợ (bộ xử lý của tôi bị đổ) và cái sau vẫn dẫn "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"đến tài liệu của tôi. Như @Jirka Kosek đề xuất, tôi nghĩ bộ xử lý XSLT của tôi có thể bị hỏng.
Jon Hadley

1
Phân phối (bộ xử lý XSLT tôi đang sử dụng) thảo luận về danh sách gửi thư về vấn đề này có tại đây: coactivate.org/projects/deliverance/lists/ tựa
Jon Hadley

1
Các dịch vụ w3c validator đưa ra một cảnh báo khi tài liệu bắt đầu với<!DOCTYPE html SYSTEM "about:legacy-compat">
Adrian W


20

Với Saxon 9.4, bạn có thể sử dụng:

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

Điều này tạo ra:

<!DOCTYPE HTML>

2
Thật không may, nó đặc trưng cho Saxon. Mặt khác, nó chỉ đơn giản là câu trả lời ngắn gọn nhất cho Q. Tôi tự hỏi liệu điều này có hoạt động với các bộ xử lý XSLT 2.0 khác không?
Paulb

Điều này bây giờ không còn cụ thể chỉ với Saxon mà còn được hỗ trợ trong các nguồn libxslt / xsltproc. Xem chi tiết ở cuối stackoverflow.com/questions/3387127/set-html5-doctype-with-xslt/
Kẻ

10

Sử dụng doctype-system thay vì doctype-public


Điều đó vẫn để lại "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"trong doctype.
Jon Hadley

5
if <xsl: output doctype-system = "about: legacy-compat" method = "html" /> tạo ra những gì bạn nói, thì chắc chắn có lỗi trong bộ xử lý XSLT mà bạn sử dụng.
Jirka Kosek

Hành vi này được chỉ định ở đâu? Điều này chắc chắn không hoạt động trong JAXP XSLT.
rustyx

xml.apache.org/xalan-j cái này không đưa ra gần nơi bạn mong đợi - có thể chỉ là tuổi tác.
PandaWood

9

Bạn phải sử dụng XHTML 1.0 Strict như DOCTYPE nếu bạn muốn XHTML đầu ra phù hợp với HTML5, serializer xml libxml2 của có một chế độ đầu ra đặc biệt kích hoạt bởi các XHTML 1.0 doctypes đảm bảo đầu ra là XHTML tương thích, (ví dụ <br />chứ không phải là <br/>, <div></div>chứ không phải <div/>). doctype-system="about:legacy-compat"không không kích hoạt chế độ tương thích này

Nếu bạn hài lòng với đầu ra html, thì cài đặt <xsl:output method="html">sẽ thực hiện đúng. Sau đó, bạn có thể đặt doctype với <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>, mặc dù điều này sẽ cần hệ thống ống nước ở nơi thích hợp vì XDV chưa hỗ trợ điều này.

Trong thực tế có vẻ như nó <xsl:output method="html"/>cũng không thực sự giúp ích - điều này sẽ dẫn đến kết quả <br/>đầu ra là <br></br>.


6

Biến thể lời khuyên này của Jirka Kosek , thông qua chủ đề XDV nâng cao trên Plone.org dường như hoạt động với tôi trong tập thể.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
Có, nhưng như tôi đã nhận xét trong câu trả lời 0xA3, @ doctype-system hoặc @ doctype-public trống rỗng (cũng vậy, nó chống lại thông số kỹ thuật!)

5

Đây là một nhận xét, nhưng tôi không có đủ điểm nghiệp để đặt nó vào đúng chỗ. Thở dài.

Tôi đánh giá cao đây có lẽ là cách chính xác, hướng đến tiêu chuẩn để thực hiện những gì tôi muốn (tôi đã nâng cấp nó như vậy). Nhưng cái trước không được hỗ trợ (bộ xử lý của tôi bị đổ) và cái sau vẫn cho kết quả là " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitable.dtd " trong tài liệu của tôi. Như @Jirka Kosek đề xuất, tôi nghĩ bộ xử lý XSLT của tôi có thể bị hỏng.

Không, bộ xử lý XSLT của bạn không bị hỏng, chỉ là XDV bổ sung:

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

theo mặc định, vì vậy khi bạn thêm một giây, <xsl:output doctype-system="about:legacy-compat"/>phần trước doctype-publickhông bị ghi đè.

Lưu ý rằng nghiêm ngặt XHTML 1.0 được liệt kê dưới dạng chuỗi doctype lỗi thời , do đó, hoàn toàn có thể chấp nhận sử dụng loại tài liệu này và vẫn gọi nó là HTML5.


Nếu bộ xử lý XSLT của bạn thêm các thành phần vào biểu định kiểu của bạn hoặc có một số giá trị mặc định thuộc tính không chuẩn, điều đó có nghĩa là nó bị hỏng.

6
@Alejandro: XDV (hiện được đổi tên thành diazo) không phải là bộ xử lý XSLT, nó là một chủ đề -> trình biên dịch XSLT. Đó là XDV đang thêm các giá trị mặc định vào XSLT đã biên dịch. Tôi biết điều này bởi vì tôi đã viết nó;)
Laurence Rowe

3

Xin lỗi vì chỉ cung cấp các liên kết nhưng điều này đã được thảo luận trong nhóm WHATWG nhưng đã nhiều tháng kể từ khi tôi xử lý nó. Ở đây Ian Hickson và một số chuyên gia XML thảo luận về điều này:
http://lists.w3.org/Archives/Public/public-html/2009Jan/0640.html
http://markmail.org/message/64aykbbsfzlbidzl
và đây là vấn đề thực tế số:
http://www.w3.org/html/wg/tracker/issues/54
và đây là cuộc thảo luận này
http://www.contentwithstyle.co.uk/content/xslt-and-html-5-probols


2

Sử dụng thẻ này

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

1

Đoạn mã sau sẽ hoạt động như một mẫu độc lập nếu được lưu dưới dạng 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>

Người giới thiệu


1

đó là những gì tôi sử dụng để tạo ra một loại tài liệu html5 tương thích (lấy saxon html5 ra, nếu không thì làm điều kế thừa)

<?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" />
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.