如何在另一个xsl中包含带有js脚本标记的xsl文件?

时间:2014-05-08 10:02:41

标签: javascript html xslt

我有xsl,我想包含另一个包含javascript文件脚本标签的xsl
主xsl:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/Reflection">
    <xsl:text disable-output-escaping='yes'>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "SiteRef_getCSS?CSSName=Site/xhtml1-transitional.dtd"></xsl:text>
    <html>
        <head>
            <link rel="stylesheet" href="SiteRef_getCSS?CSSName=Site/jquery-ui.css" type="text/css"/>
            <link rel="stylesheet" href="SiteRef_getCSS?CSSName=Site/jquery.plupload.queue.css" type="text/css" media="screen"/>

            <xsl:include href="CommonIncludes.xsl"/>

            <!--<script type="text/javascript" src="SiteRef_getJS?JSName=jquery/jquery-1.9.1.min.js"/>-->
            <script type="text/javascript" src="SiteRef_getJS?JSName=jquery/jquery-ui.js"/>
        </head>
    </html>

CommonIncludes.xsl:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="*">
        <link rel="stylesheet" href="SiteRef_getCSS?CSSName=Site/site.css" type="text/css"/>

        <script type="text/javascript" src="SiteRef_getJS?JSName=jquery/jquery-1.9.1.min.js"/>
        <script type="text/javascript" src="SiteRef_getJS?JSName=Site/common.js"/>
        <script type="text/javascript" src="SiteRef_getJS?JSName=Site/MessagesConstants.js"/>
        <script type="text/javascript" src="SiteRef_getJS?JSName=Site/win_functions.js"/>
        <script type="text/javascript" src="SiteRef_getJS?JSName=Site/resizeFunctions.js"/>
    </xsl:template>
</xsl:transform>

我遇到了这个异常: javax.xml.transform.TransformerConfigurationException:无法编译样式表
显然,我的CommonIncludes.xsl编写不正确 有人可以告诉我我做错了什么吗?

1 个答案:

答案 0 :(得分:0)

您需要在任何模板之前将xsl:include移动到样式表的开头。这足以让XSLT处理器满意。但它不会在包含的文件中调用或应用模板来输出linkscript元素。要实现这一目标,您可以使用

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:import href="CommonIncludes.xsl"/>
<xsl:template match="/Reflection">
    <xsl:text disable-output-escaping='yes'>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "SiteRef_getCSS?CSSName=Site/xhtml1-transitional.dtd"></xsl:text>
    <html>
        <head>
            <link rel="stylesheet" href="SiteRef_getCSS?CSSName=Site/jquery-ui.css" type="text/css"/>
            <link rel="stylesheet" href="SiteRef_getCSS?CSSName=Site/jquery.plupload.queue.css" type="text/css" media="screen"/>
            <xsl:apply-imports/>

但是,我会将导入文件中的模板匹配更改为更专业的内容,例如<xsl:template match="/*">...</xsl:template><xsl:template match="/Reflection">..</xsl:template>

或者使用命名模板并将其调用到要包含元素的位置。

xsl:output允许您指定文档类型和URL,并通过XSLT处理器对这些输出进行序列化,不需要手动执行。

以下是执行apply-importsxsl:import的最小但完整的示例:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:import href="test2014050802.xsl"/>

<xsl:template match="/Reflection">
    <html>
        <head>
            <link rel="stylesheet" href="SiteRef_getCSS?CSSName=Site/jquery-ui.css" type="text/css"/>
            <link rel="stylesheet" href="SiteRef_getCSS?CSSName=Site/jquery.plupload.queue.css" type="text/css" media="screen"/>
            <xsl:apply-imports/>
            <script type="text/javascript" src="SiteRef_getJS?JSName=jquery/jquery-ui.js"/>
        </head>
        <body>
          <xsl:apply-templates/>
        </body>
    </html>
</xsl:template>

</xsl:transform>


<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:template match="/Reflection">
        <link rel="stylesheet" href="SiteRef_getCSS?CSSName=Site/site.css" type="text/css"/>

        <script type="text/javascript" src="SiteRef_getJS?JSName=jquery/jquery-1.9.1.min.js"/>
        <script type="text/javascript" src="SiteRef_getJS?JSName=Site/common.js"/>
        <script type="text/javascript" src="SiteRef_getJS?JSName=Site/MessagesConstants.js"/>
        <script type="text/javascript" src="SiteRef_getJS?JSName=Site/win_functions.js"/>
        <script type="text/javascript" src="SiteRef_getJS?JSName=Site/resizeFunctions.js"/>
    </xsl:template>

</xsl:transform>

对战时
<Reflection/>

我得到了输出

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

      <link rel="stylesheet" href="SiteRef_getCSS?CSSName=Site/jquery-ui.css" type="text/css">
      <link rel="stylesheet" href="SiteRef_getCSS?CSSName=Site/jquery.plupload.queue.css" type="text/css" media="screen">
      <link rel="stylesheet" href="SiteRef_getCSS?CSSName=Site/site.css" type="text/css"><script type="text/javascript" src="SiteRef_getJS?JSName=jquery/jquery-1.9.1.min.js"></script><script type="text/javascript" src="SiteRef_getJS?JSName=Site/common.js"></script><script type="text/javascript" src="SiteRef_getJS?JSName=Site/MessagesConstants.js"></script><script type="text/javascript" src="SiteRef_getJS?JSName=Site/win_functions.js"></script><script type="text/javascript" src="SiteRef_getJS?JSName=Site/resizeFunctions.js"></script><script type="text/javascript" src="SiteRef_getJS?JSName=jquery/jquery-ui.js"></script></head>
   <body></body>
</html>

并且没有编译错误。

至于xsl:output,如果需要,让我们在另一个问题中解决这个问题。