我有以下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('&','&');
return strValue;
}
</msxsl:script>
我尝试在http://xslt.online-toolz.com/tools/xslt-transformation.php上运行它,但它返回以下错误:
错误:XSLTProcessor :: transformToXml()[xsltprocessor.transformtoxml]: XPath评估没有返回任何结果。
要查看整个脚本,请查看this Fiddle。 我很感激你的帮助。
答案 0 :(得分:0)
简短的回答:看起来你在PHP上使用XSLT(至少你用它标记了PHP),但你在扩展函数中使用JScript,这是微软,而你使用msxsl:script
,这也是一个Microsoft扩展指令。
您的扩展功能目前在XML中是非法的,因此您无法运行上面的代码(您有一个未转义的&
),因此它不应该在任何处理器上运行。
如果你使用PHP,你可能会使用libxslt,这里是a tutorial。不确定你是否可以使用扩展功能,但是从描述中我怀疑你确实需要它,因为替换值中的字符可以在没有扩展功能的情况下完成(使用translate
)。
strValue = strValue.replace('&','&');
如上所述,这是一个错误。但看起来您试图阻止样式表输出&
,这意味着您试图阻止样式表创建合法的XML。这是一个滑坡,但如果你真的需要它,只需使用xsl:value-of
与disable-output-escaping
。但是,如果您实际上序列化了输出,并且处理器支持它,则效果将是可见的(不需要这样做)。
这是一个question on exactly the same subject,我向您展示了如何以简单的方式解决这个问题。也许您应该尝试首先尝试简单的解决方案(仅使用XSLT),并且只有在这还不够时,采用更复杂的解决方案(使用扩展函数)?
我的印象是你刚开始使用XSLT并且有很多问题。那很好。但似乎这些问题与理解XML的基础知识有关,这就排除了对XSLT的理解。有很多关于XML和XSLT的教程,给自己一些时间来阅读这些内容,否则它可能会继续充满挑战和混乱。
&
,但它实际上是&
,这就是它一直以XML格式存在的方式。