【发布时间】:2021-10-09 12:35:06
【问题描述】:
我编写了一个 JavaScript 函数,它在 Node.js 中运行时通过了所有输入的测试。但是,当它嵌入到 XSLT 模板(使用 MS XML 解析)中时,它现在会导致运行时错误。错误信息如下:-
COM+ Msg = Microsoft JScript runtime error
Object doesn't support this property or method
line = 47, col = 5 (line is offset from the start of the script block).
Error returned from property or method call.
错误信息中的行号对应于 JScript 函数的右括号。
代码如下:-
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="http://www.stylusstudio.com/file-utilities">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<msxsl:script language="JScript" implements-prefix="user">
<![CDATA[
function TrimmedString(inString) {
var stringArray = inString.split(' ');
var keyword;
/*logic omitted here assigns phrase to trim before in inString - assigned to keyword, blank if phrase doesn't exist*/
if (keyword !== '') {
var outString = "";
for (var i = 0; i < stringArray.length; i++) {
if (i !== 0) {
outString += " ";
}
else if (stringArray[i].indexOf(keyword) == -1) {
outString += stringArray[i];
}
else {
break;
}
}
return TrimmedString(outString.toString());
}
else {
return inString.trim();
}
}
]]>
</msxsl:script>
<xsl:template match="/">
<xsl:value-of select="user:TrimmedString(string(/XML_ParentNode/XML_ChildNode/@AttributeContainingString))"/>
</xsl:template>
</xsl:stylesheet>
当错误第一次出现时,我删除了 string.includes() 的所有实例并将它们替换为 string.indexOf() !== -1,我还替换了嵌入式 JScript 中的所有 ES6 特定功能。这似乎解决了突出显示到特定行的问题,但现在它触发了最后一个括号,我没有想法。该消息也令人困惑,因为输入参数始终是一个字符串,并且下面使用的所有方法都是字符串对象类型的相当普通的方法。
这里有没有被 XSLT 运行时不支持的方法?当我在 Node.js 上将它作为独立代码进行测试时,脚本本身很好。
谢谢, 本
【问题讨论】:
-
line = 47, col = 5- 代码没有那么长……也许是.trim()?我的意思是,如果一个字符串没有.includes(),它可能也不会有.trim() -
@Bravo 抱歉,使用的错误消息包括被 JScript 元素第 4 行的注释替换的代码。删除 .trim() 解决了这个问题。谢谢!
标签: javascript xslt-1.0 jscript