我正在使用XSLT,需要根据参数在转换后的输出中动态生成doctype。 我听说使用XSLT 1.0无法做到这一点,但使用 结果文档 标记可以使用版本2.0。
到目前为止,从this问题中的答案开始,我有类似的内容:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" indent="yes"/>
<xsl:param name="doctype.system" select="'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'" />
<xsl:param name="doctype.public" select="'-//W3C//DTD XHTML 1.0 Strict//EN'" />
<xsl:template match="/">
<xsl:result-document doctype-public="{$doctype.public}" doctype-system="{$doctype.system}" method="html">
<html>
<head>
<xsl:apply-templates select="report/head/node()"/>
</head>
<body>
<!-- ommitted for brevity -->
</body>
</html>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
以上问题是没有输出!
如果我从上面删除结果文档标记,则应用我的转换并按预期输出文档。
任何线索?我是否正确使用了结果文档标签?
更新:响应这里的一些评论,这是一个有效的小版本,一个没有的版本(省略结果文档指令的参数化)
这有效(没有结果文件):
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<html>
<head>
</head>
<body>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
输出:
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body></body>
</html>
但这不会产生任何结果:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<xsl:result-document doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" method="html">
<html>
<head>
</head>
<body>
</body>
</html>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:7)
正如您也发现的那样,Xalan仅支持XSLT 1.0,但如果您更改为Saxon 9,则可以轻松实现您想要的效果。
此外,您可以使用您的文档类型设置定义参数,而不是使用名称定义xsl:output
,并将其用作xsl:result-document
中的格式:
<xsl:output name="my-xhtml-output" method="xml" encoding="UTF-8" indent="yes"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
在xsl:result-document
中,您可以使用以下输出格式:
<xsl:result-document href="{$filename}" format="my-xhtml-output">
...
</xsl:result-document>
Imo,如果您有很多输出格式,这样可以更轻松地维护不同的输出格式。
答案 1 :(得分:2)
在使用XSLT 1.0引擎时,您必须使用xsl:text
创建动态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" indent="yes" />
<xsl:param name="doctype.system" select="'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'" />
<xsl:param name="doctype.public" select="'-//W3C//DTD XHTML 1.0 Strict//EN'" />
<xsl:template match="/">
<xsl:text disable-output-escaping='yes'><!DOCTYPE html PUBLIC "</xsl:text>
<xsl:value-of select="$doctype.public" />
<xsl:text disable-output-escaping='yes'>" "</xsl:text>
<xsl:value-of select="$doctype.system" />
<xsl:text disable-output-escaping='yes'>"></xsl:text>
<!-- further processing here -->
<html>
</html>
</xsl:template>
</xsl:stylesheet>