Javascript 根据RNG模式的XML自动完成
让Javascript 根据RNG模式的XML自动完成,javascript,xml,fsm,relaxng,Javascript,Xml,Fsm,Relaxng,让RNG成为RELAXNG规范,XML成为相对于RNG的有效XML文档,指定n为XML文档的n第个字符,B是XML和XML[n=B]的节点在字符n处插入节点B的XML文档 我想定义一个函数suggest(RNG,XML,n)→ {Node}=O这样 对于任何B∈ O,XML[n=B]是相对于RNG的有效XML文档 对于任何C∉ O,XML[n=C]无效 目前,我尝试了两种方法: 对XML和RNG使用双递归,在元素XML[n]处,包含n字符和RNGRNG[n]匹配XML[n],并返回元组(布
RNG
成为RELAXNG规范,XML
成为相对于RNG
的有效XML文档,指定n
为XML
文档的n
第个字符,B
是XML
和XML[n=B]的节点
在字符n
处插入节点B
的XML文档
我想定义一个函数suggest(RNG,XML,n)→ {Node}=O
这样
- 对于任何
,B∈ O
是相对于XML[n=B]
的有效XML文档RNG
- 对于任何
,C∉ O
无效XML[n=C]
目前,我尝试了两种方法:
XML
和RNG
使用双递归,在元素XML[n]
处,包含n
字符和RNGRNG[n]
匹配XML[n]
,并返回元组(布尔值,建议)
,然后根据这两个元素决定下一步返回什么。例如,如果当前RNG
节点是a
和B
之间的一个选择,如果fn(a)[0]
为真且fn(B)[0]
为假,则返回(真,fn(a)[1])
,如果两者均为假,则返回(真,fn(a)[1])
可能不太糟糕,但肯定不总是正确的答案
*r
和RNG[n]
的子堆,*x
和XML[n]
的子堆,*c
和正在解决的当前选择,以及*s
和输出建议),以便
- 如果
等于*r
,则弹出*x
和*r
,如果*x
不等于*r
,则弹出*x
并将其推入*r
*s
- 如果
是*r
和a
之间的选择,则在B
中按*c
,在(*r,*x,B,null)
中按*r
a
- 如果
是ref,则将其弹出并推送匹配的定义,如果是定义,则将其作为一个组进行处理*r
- 如果
是一个组,则将其元素推送到*r
*r
- 如果
等于*c[0]
,并且*r
是一个节点,则弹出它,将*c[2]
和*r
分别设置为*x
和*c[2]、*c[0]
,在*c[1]
中按*c
(*r、*x、null、*s)
- 如果
等于*c[0]
且*r
为空,则弹出它,比较*c[2]
和*s
,然后决定(这很难),保留哪一个*c[3]
- 根据选择和组简化其他节点(不太难),使它们只有两个元素
s时,并且检查无限循环也变得非常困难
上深度复制每个XML节点
s。例如,以
:我应该如何对其进行编码,以便建议所有有效节点我知道多个编辑器(例如Emacs)提供了此选项,但我不确定它们是否确实生成了有效的文档,而且我对Lisp还不够熟悉 因此,我正在寻找一种在DOM上实现这一点的“好方法”,或者更好的JavaScript库来实现这一点