XSLT로 HTML5 doctype 설정


134

XSLT를 통해 파일의 doctype을 HTML5로 깔끔하게 설정하는 방법은 <!DOCTYPE html>(이 경우 collector.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
또한 PUBLIC "XSLT-compat"사용이 오래되었습니다. XSLT 호환 HTML5 doctype은 이제 <! DOCTYPE HTML SYSTEM "about : legacy-compat">입니다. 참조 dev.w3.org/html5/spec/syntax.html#doctype-legacy-string
Alohci

1
마지막 편집기 WD부터는 거의 모든 doctype이 허용되는 것처럼 보입니다 : 짧고 <!DOCTYPE html>, 레거시 <!DOCTYPE HTML SYSTEM "about:legacy-compat">및 더 이상 사용되지 않는 ( "하지 말아야합니다") HTML 4, HTML 4.01, XHTML 1.0 및 XHTML 1.1 (SYSTEM이있을 때 모든 엄격한 DTD).

1
(현재) W3C 권장 사항으로 HTML5에 대한 답변을 업데이트하십시오.
Peter Krauss

답변:


147

나는 이것이 현재 doctype을 텍스트로 작성해야만 지원된다고 생각합니다.

<?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-escapingCasey의 의미
yegor256

더 이상이 프로젝트에서 작업하고 있지 않으므로 테스트 할 수 없습니다. 그러나이를 투표에 기반한 최선의 답변으로 표시하십시오.
존 해들리

나는 이것을 항상 사용합니다. 감사.
jgroenen

나를 구 해주셔서 감사합니다
cgatian

66

간단한 HTML doctype <!DOCTYPE html>을 사용하려면 다음 disable-output-escaping기능 을 사용해야합니다 <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>. 그러나 XSLT disable-output-escaping선택적 기능 이므로 XSLT 엔진 또는 직렬화 파이프 라인이이를 지원하지 않을 수 있습니다.

이러한 이유로 HTML5는 HTML5를 인식하지 못하는 XSLT 버전 (즉, 현재 존재하는 모든 XSLT 버전) 및 동일한 문제가있는 다른 시스템과의 호환성을위한 대체 문서 유형을 제공합니다. 대체 doctype은 <!DOCTYPE html SYSTEM "about:legacy-compat">입니다. 이 doctype을 출력하려면, 속성 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
이 문제에 관한 전달 (사용중인 XSLT 프로세서) 메일 링리스트 토론은 다음과 같습니다. coactivate.org/projects/deliverance/lists/…
Jon Hadley

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
불행히도, 그것은 Saxon에 특정 적입니다. 반면에, 그것은 Q에 대한 가장 간결한 답변입니다. 이것이 다른 XSLT 2.0 프로세서와 함께 작동하는지 궁금합니다.
Paulb

이것은 이제 더 이상 Saxon에만 국한된 것이 아니라 libxslt / xsltproc 소스에서도 지원됩니다. stackoverflow.com/questions/3387127/set-html5-doctype-with-xslt/…
sideshowbarker

10

doctype-public 대신 doctype-system을 사용하십시오.


그것은 여전히 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"doctype에 남아 있습니다 .
존 해들리

5
<xsl : output doctype-system = "about : legacy-compat"method = "html"/>이 말을하는 경우 사용하는 XSLT 프로세서에 반드시 버그가있는 것입니다.
Jirka Kosek

이 동작은 어디에 지정되어 있습니까? JAXP XSLT에서는 작동하지 않습니다.
rustyx

xml.apache.org/xalan-j 이것은 당신이 기대하는 것 근처에 아무 것도 제공하지 않습니다. 아마 나이입니다.
PandaWood

9

당신은 있어야 당신은 HTML5와 XHTML 출력이 일치 할 경우 문서 타입으로 XHTML 1.0 엄격한 사용, libxml2를의 XML 시리얼 라이저는 XHTML 1.0적인 doctypes 보장 출력에 의해 트리거 특별한 출력 모드를 가지고 XHTML은, 호환 (예입니다 <br />보다는 <br/>, <div></div>보다는 오히려 <div/>). 이 호환성 모드를 트리거 doctype-system="about:legacy-compat"하지 않습니다

html 출력에 만족한다면 설정 <xsl:output method="html">이 옳은 일을해야합니다. 그런 다음 doctype을로 설정할 수 <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>있지만 XDV는 아직이를 지원하지 않으므로 적절한 위치에서 배관이 필요합니다.

실제로 그것은 <xsl:output method="html"/>실제로 도움이되지 않는 것 같습니다 -이것은 다음 <br/>과 같이 출력됩니다 <br></br>.


6

이러한 변화 지르 카 Kosek의 조언 을 통해, 고급 XDV의 테마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 strict는 더 이상 사용되지 않는 허용 된 doctype 문자열 로 표시 되므로이 doctype 을 사용하고 HTML5라고 부르는 것이 완벽하게 허용됩니다.


XSLT 프로세서가 스타일 시트에 요소를 추가하거나 일부 비표준 속성 기본값이있는 경우 해당 속성이 손상되었음을 의미합니다.

6
@Alejandro : XDV (현재는 diazo로 이름이 바))는 XSLT 프로세서가 아니며 테마-> XSLT 컴파일러입니다. 컴파일 된 XSLT에 기본값을 추가하는 것은 XDV입니다. 나는 그것을 썼기 때문에 이것을 알고있다;)
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-problems


2

이 태그를 사용

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

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 doctype을 생성하는 데 사용하는 것입니다 (색소폰을 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.