Rhino E4X不允许{expression}中的xml文字

Rhino E4X does not allow xml literal in {expression}

本文关键字:中的 xml 文字 expression E4X 不允许 Rhino      更新时间:2023-09-26

我使用rhino1_7R2。我发现以下程序会导致语法错误(非法形成的XML语法):

function b(node) { 
   return <span>{node}{node}</span>;  
}
a=<span>foo {b(<div>bar</div>)} baz</span>;
alert(a);

但它工作:

function b(node) { 
   return <span>{node}{node}</span>;  
}
var bar=<div>bar</div>;
a=<span>foo {b(bar)} baz</span>;
alert(a);

看起来Rhino在{expression}中不允许字符xml。首先,我认为ECMAScript规范禁止这样做。但是在Firefox(3.6.23)中允许这种语法。所以可能不是因为ECMA规范。

这是在Firefox中运行的测试页面(它可以工作):

<script>
    function b(node) { 
        return <span>{node}{node}</span>;  
    }
    a=<span>foo {b(<div>bar</div>)} baz</span>;
    alert(a);
</script>

有人能告诉我这是因为Rhino的bug或者Rhino或Ecmascript的规范吗?

我将在Java/Rhino中附加测试代码。问候。
import org.mozilla.javascript.Context;
import org.mozilla.javascript.ScriptableObject;

public class Main {
    public static void main(String[] args) {
        Context c=Context.enter();
        ScriptableObject scope = c.initStandardObjects();
        String source_OK = 
                "function b(node) { " +
                "   return <span>{node}{node}</span>;" +
                "}" +
                "var bar=<div>bar</div>;" +
                "a=<span>foo {b(bar)} baz</span>;   ";
        Object a=c.evaluateString(scope, source_OK, "TEST", 1, null);
        System.out.println(a);
        String source_NG = 
            "function b(node) { " +
            "   return <span>{node}{node}</span>;" +
            "}" +
            "a=<span>foo {b(<div>bar</div>)} baz</span>;   ";
        a=c.evaluateString(scope, source_NG, "TEST", 1, null); //Error!
        System.out.println(a);
        Context.exit();
    }
}

对不起,我自己发现这是Rhino的bug:

https://bugzilla.mozilla.org/show_bug.cgi?id=323890

我还为这个错误发送了一个补丁。