我已经遍布谷歌,无法弄清楚如何正确实现这一点。它根本不可能,或者我缺少某种语法?自从我完成JavaScript以来已经很长时间了,所以我可能会错过一些非常简单的东西。
我使用<xsl:text disabled-output-escaping="yes"><![CDATA[
并使用XML 1.0将一些JavaScript嵌入到XSL文件中。
所以我有这样的事情:
function seconds(s) {
s = s / 60;
document.write(s + " ");
if (s > 2) {
document.write(s + " " + '<xsl:call-template name="resources"><xsl:with-param name="res" select="minutes"/></xsl:call-template>');
}
else {
document.write(s + " " + '<xsl:call-template name="resources"><xsl:with-param name="res" select="minute"/></xsl:call-template>');
}
}
所以发生了什么,我得到了“60”变量“s”增量的秒数。我需要计算到分钟,但是,我需要调用模板来实际打印字符串“分钟”或“分钟”。我知道调用模板在XSL中有效。但是当我将它嵌入JavaScript时,它不会显示“分钟”或“分钟”。它只显示修正的整数和空格。
如何将这个xsl行嵌入到JavaScript中,或者它是否可能?
编辑: 所以我会尝试澄清一些。 XML文件上的数据并不重要。我想我的问题是,对于document.write行,将xxl代码嵌入其中有什么问题。因为它实际上并不打印任何模板打印(这主要是将“分钟/分钟”这个词翻译成用户选择的语言,如果语言不存在则默认为英语。因此并不重要。我只是需要知道document.write行的语法有什么问题,以防止显示XSL代码。或者可以将它嵌入到JavaScript中吗?所有的JavaScript都是通过.xsl文件上的CDATA封装完成的。希望这更加明确。
答案 0 :(得分:2)
您的问题有点令人困惑,因为它给您的印象是您尝试使用Javascript调用 xsl:template ,这是不可能的。但我认为你实际上说的是你试图在XSLT中调用一个模板作为输出一些恰好是javascript的文本的一部分,以便以后在浏览器中使用。
原因不起作用是因为正如您在问题中所说,您输出的javascript文本被此包围...
<xsl:text disabled-output-escaping="yes"><![CDATA[
... Javascript code here..
]]></xsl:text>
特别是,CDATA标签的使用意味着XSLT将其中的所有内容视为未解析的文本,因此如果您恰好使用xslt语法恰好有一些文本则无关紧要。它只是被视为任何其他文本。
你可以做些什么来解决这个问题,在每个 xsl:call-template 之前关闭CDATA并在之后重新打开它。像这样的东西
<xsl:text disable-output-escaping="yes"><![CDATA[
function seconds(s) {
s = s / 60;
document.write(s + " ");
if (s > 2) {
document.write(s + " " + ']]></xsl:text>
<xsl:call-template name="resources"><xsl:with-param name="res" select="'minutes'"/></xsl:call-template>
<xsl:text disable-output-escaping="yes"><![CDATA[');
}
else {
document.write(s + " " + ']]></xsl:text>
<xsl:call-template name="resources"><xsl:with-param name="res" select="'minute'"/></xsl:call-template>
<xsl:text disable-output-escaping="yes"><![CDATA[');
}
}
]]>
</xsl:text>
或者使用最外面的 xsl:text 和 CDATA 标记稍微整理一些,并且只使用它们来包围任何包含任何&#39;逃避&#39;字符。
<xsl:template name="outputSeconds">
function seconds(s) {
s = s / 60;
document.write(s + " ");
if (s <xsl:text disable-output-escaping="yes">></xsl:text> 2) {
document.write(s + " " + '<xsl:call-template name="resources"><xsl:with-param name="res" select="'minutes'"/></xsl:call-template>');
}
else {
document.write(s + " " + '<xsl:call-template name="resources"><xsl:with-param name="res" select="'minute'"/></xsl:call-template>');
}
}
</xsl:template>
有两点需要注意:
1)在您的问题中,您可以参考&#34;禁用 - 输出 - 转义&#34;什么时候应该&#34;禁用 - 输出 - 逃避&#34;
2)你打电话给&#34;资源&#34;带参数的模板,如果要传入字符串值,而不是节点的值,则将值括在撇号中; <xsl:with-param name="res" select="'minute'"/>