0

我在我的 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?请帮我。

4

3 回答 3

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,而是覆盖了构建 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

于 2015-01-20T17:44:30.420 回答
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>
于 2015-01-19T10:50:58.163 回答
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 处理器?你的模板在哪里?

于 2015-01-19T10:13:01.367 回答