我在我的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?请帮我。
答案 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"> </script>
...
</head>
</xsl:template>
答案 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("<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>