如何在xsl输出上放置一个java脚本函数?

时间:2015-09-03 08:24:07

标签: javascript php xml xslt xpath

我有以下XML节点:

<CARRIERNAME>
    <![CDATA[AT&T]]>
</CARRIERNAME>

我需要在输出上放置一个JavaScript函数,在这种情况下:“AT&amp; T”来格式化它。

这是我的方法:

<xsl:value-of select="user:Format_escapeEmbeddedCommas(string(CARRIERNAME))"/>

我也有:

<msxsl:script language="JScript" implements-prefix="user">
    function Format_escapeEmbeddedCommas(colValue) {
        var strValue = colValue;
        strValue = strValue.replace('&amp;','&');
        return strValue;
    }
</msxsl:script>

我尝试在http://xslt.online-toolz.com/tools/xslt-transformation.php上运行它,但它返回以下错误:

  

错误:XSLTProcessor :: transformToXml()[xsltprocessor.transformtoxml]:   XPath评估没有返回任何结果。

要查看整个脚本,请查看this Fiddle。 我很感激你的帮助。

1 个答案:

答案 0 :(得分:0)

简短的回答:看起来你在PHP上使用XSLT(至少你用它标记了PHP),但你在扩展函数中使用JScript,这是微软,而你使用msxsl:script,这也是一个Microsoft扩展指令。

您的扩展功能目前在XML中是非法的,因此您无法运行上面的代码(您有一个未转义的&),因此它不应该在任何处理器上运行。

如果你使用PHP,你可能会使用libxslt,这里是a tutorial。不确定你是否可以使用扩展功能,但是从描述中我怀疑你确实需要它,因为替换值中的字符可以在没有扩展功能的情况下完成(使用translate)。

strValue = strValue.replace('&amp;','&');

如上所述,这是一个错误。但看起来您试图阻止样式表输出&amp;,这意味着您试图阻止样式表创建合法的XML。这是一个滑坡,但如果你真的需要它,只需使用xsl:value-ofdisable-output-escaping。但是,如果您实际上序列化了输出,并且处理器支持它,则效果将是可见的(不需要这样做)。

这是一个question on exactly the same subject,我向您展示了如何以简单的方式解决这个问题。也许您应该尝试首先尝试简单的解决方案(仅使用XSLT),并且只有在这还不够时,采用更复杂的解决方案(使用扩展函数)?

我的印象是你刚开始使用XSLT并且有很多问题。那很好。但似乎这些问题与理解XML的基础知识有关,这就排除了对XSLT的理解。有很多关于XML和XSLT的教程,给自己一些时间来阅读这些内容,否则它可能会继续充满挑战和混乱。