xsl:javascript函数中的call-template

时间:2013-11-27 01:18:47

标签: javascript xml xslt

我已经遍布谷歌,无法弄清楚如何正确实现这一点。它根本不可能,或者我缺少某种语法?自从我完成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封装完成的。希望这更加明确。

1 个答案:

答案 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">&gt;</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'"/>