🙆‍♀️

XSLT3のHTML5出力で「meta http-equiv」を出さない方法

2022/07/01に公開

XSLT 3.0では、@html-versionへ5などを指定することでHTML5出力ができます。@html-versionの数値解釈は実際のところ処理系依存です。

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL" version="3.0">
  <xsl:output method="html" html-version="5.0"/>
  ...
</xsl:transform>

ただし、これで現代的なHTMLが書けるかというと罠があります。
Saxon-HE 11で確認する限り、こいつは<head>内にお気持ちを自動挿入する。

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" >
</head>

もし自分で<meta charset="UTF-8"/>をテンプレートに記述していた場合、両方が出力されinvalidなHTMLが生成されてしまいます。

解決策

  <xsl:output method="html" html-version="5.0" include-content-type="no"/> 

ということで、 @include-content-typeで挿入を抑制し、テンプレートには<meta charset="UTF-8"/>を書いたままにすればよいです。

xsl:output/@encodingにUTF-8以外を指定したり入力ではまた違うエンコーディング使ったりといった無茶苦茶やる場合はこれでは対処できないかもしれませんが。

参考資料

https://www.w3.org/TR/xslt-30/#element-output

Discussion