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

时间:2011-09-29 03:51:54

标签: javascript rhino e4x

我正在使用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}中使用litral 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();
    }
}

1 个答案:

答案 0 :(得分:1)

抱歉,我发现这是我自己的Rhino的错误:

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

我还发了一个针对这个bug的补丁。