代码之家  ›  专栏  ›  技术社区  ›  Joel

XSLT转换中的动态doctype(正确使用结果文档指令)

  •  3
  • Joel  · 技术社区  · 14 年前

    我正在使用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>
    

    上面的问题是没有生成输出!

    如果我从上面删除results文档标记,我的转换将被应用,文档将按预期输出。

    有线索吗?我是否正确使用了结果文档标签?


    更新 :针对一些评论,这里有一个小版本可以工作,而另一个版本不能(省略结果文档指令的参数化)

    此工作(无结果文档):

    <?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>
    
    2 回复  |  直到 7 年前
        1
  •  7
  •   Per T    14 年前

    正如您还发现的,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文档 然后使用此输出格式:

    <xsl:result-document href="{$filename}" format="my-xhtml-output">
      ...
    </xsl:result-document>
    

    在Imo中,如果有很多不同的输出格式,这将使维护它们更加容易。

        2
  •  2
  •   Dirk Vollmar    14 年前

    在使用XSLT 1.0引擎时,必须使用 xsl:text :

    <?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'>&lt;!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>