javax.xml.transform.TransformerException:样式表中的此位置不允许使用iframe

时间:2015-01-19 08:41:04

标签: javascript xslt iframe dspace

我在我的xsl文件中放了一个javascript函数。每当触发onclick事件时,都必须调用此函数。

<script type= "text/javascript">
    <xsl:text>
        function embeddedPreview(source) {
            if($("#embed").length > 0) {
            //set the source to the location asked for
                $("#embed").attr("src", source);
            } else {
                //Create the embed iframe
                $("#preview-embed").append("<iframe id='embed' src='"+source+"' width='100%' height='342px' style='border:none;'/>");         //requires jQuery
            }
        }
    </xsl:text>
</script>

当我运行此操作时,会发生以下错误,指向第9行。

javax.xml.transform.TransformerException: iframe is not allowed in this position in the stylesheet!

以下是我的xsl文件的一部分,其中必须追加iframe,特别是在id为“preview-embed”的div中。                                                      

这是什么意思? div是否不允许附加iframe?请帮我。

3 个答案:

答案 0 :(得分:1)

在DSpace XMLUI中,我相信这是包含jQuery的官方方式。在主题的sitemap.xmap文件中,添加如下所示的loadJQuery行。这种方法的好处是只在使用时才包含jQuery。

        <map:match pattern="**">

            <!-- Step 1: Generate the DRI page -->
            <map:generate type="file" src="cocoon://DRI/{1}"/>

            <!-- Step 2 Add page metadata -->
            <map:select type="browser">
                <!-- Internet explorer 6 -->
                <map:when test="explorer6">
                    <map:transform type="IncludePageMeta">
                        <map:parameter name="stylesheet.screen#1" value="lib/style.css"/>
                        <map:parameter name="stylesheet.screen#2" value="lib/style-ie6.css"/>

                        <map:parameter name="theme.path" value="{global:theme-path}"/>
                        <map:parameter name="theme.name" value="{global:theme-name}"/>
                    </map:transform>
                </map:when>
                <!-- The theme has been tested with firefox 2.0 & i.e. 7.0 -->
                <map:otherwise>
                    <map:transform type="IncludePageMeta">
                        <map:parameter name="stylesheet.screen" value="lib/style.css"/>

                        <map:parameter name="javascript#1" value="../../loadJQuery.js"/>
                        <map:parameter name="javascript#2" value="lib/gu-custom.js"/>
                        <map:parameter name="javascript#3" value="../mobile/lib/cookies.js"/>
                        <map:parameter name="javascript#4" value="../mobile/lib/detectmobile.js"/>

                        <map:parameter name="theme.path" value="{global:theme-path}"/>
                        <map:parameter name="theme.name" value="{global:theme-name}"/>
                    </map:transform>
                </map:otherwise>
            </map:select>

我发现在某些情况下,当我需要加载jQuery时,没有加载jQuery。我没有使用上面的机制包含jQuery,而是覆盖了构建html头块的XMLUI模板,并在那里对jQuery进行了显式调用。

<xsl:template name="buildHead">
    <head>
        ...
        <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js">&#160;</script>
        ...
    </head>
</xsl:template>

我覆盖的模板存在于此处:https://github.com/DSpace/DSpace/blob/master/dspace-xmlui/src/main/webapp/themes/dri2xhtml/structural.xsl#L152

答案 1 :(得分:0)

事实上,您的XSL认为<iframe是标记的开头,标记格式不正确。您应该使用以下内容:

 <xsl:text disable-output-escaping="yes">
     function embeddedPreview(source) {
         if($("#embed").length > 0) {
         //set the source to the location asked for
             $("#embed").attr("src", source);
         } else {
             //Create the embed iframe
            $("#preview-embed").append("&lt;iframe id='embed' src='"+source+"' width='100%' height='342px' style='border:none;'/>");         //requires jQuery
        }
    }
</xsl:text>

但是错误信息有点奇怪......您使用哪种XSL-T处理器?模板位于哪里?

答案 2 :(得分:0)

您的XSL样式表必须是格式良好的XML文档一个有效的XSLT文档。

<xsl:text>元素不能包含其他元素(*) - 从XSL处理器的角度来看,<iframe />是一个元素,它并不关心它坐在JavaScript字符串中,因为XSL处理器根本不了解JS。

(*) 规范:http://www.w3.org/TR/xslt#element-text表明<xsl:text>可能只包含#PCDATA。


因此,您的文档可能是格式良好的XML,但它不是有效的XSLT。您可能想要使用的是CDATA部分:

<xsl:template match="foo">
  <script type="text/javascript"><![CDATA[
    function embeddedPreview(source) {
        if($("#embed").length > 0) {
            //set the source to the location asked for
            $("#embed").attr("src", source);
        } else {
            //Create the embed iframe
            $("#preview-embed").append("<iframe id='embed' src='"+source+"' width='100%' height='342px' style='border:none;'/>");
        }
   }
]]></script>
</xsl:template>

实际应该做的是将所有JavaScript代码移动到外部JS文件。

<xsl:template match="foo">
  <script type="text/javascript" src="preview.js"></script>
</xsl:template>