![ConTeXt:XML 处理和缓冲区](https://linux22.com/image/455632/ConTeXt%EF%BC%9AXML%20%E5%A4%84%E7%90%86%E5%92%8C%E7%BC%93%E5%86%B2%E5%8C%BA.png)
我知道缓冲区和宏不能很好地协同工作,所以我从逐字 XML来自 wiki 的指南。
但是,当尝试进入xmlflush
环境时,操作 catcode 表是不够的userdata
:
\startxmlsetups xml:initialize
\xmlsetsetup{#1}{*}{xml:*}
\stopxmlsetups
\startxmlsetups xml:data
\pushcatcodetable
\setcatcodetable\ctxcatcodes
\startuserdata[xyz] % < trouble here
\xmlflush{#1}
\stopuserdata
\popcatcodetable
\stopxmlsetups
\xmlregistersetup{xml:initialize}
\defineuserdata[xyz][alternative=xyzalt]
\defineuserdataalternative[xyzalt][renderingsetup=xyzimpl]
\startsetups[xyzimpl]
\getinlineuserdata % no other options for now
\stopsetups
\startbuffer[buf]
<data>123123</data>
\stopbuffer
\starttext
\xmlprocessbuffer{buf}{buf}{}
\stoptext
运行上下文给出:
tex error > runaway error: end of file encountered
mtx-context | fatal error: return code: 1
我如何使用xmlflush
或类似的东西处理子节点并将结果加载到start/stopuserdata
?
我发现其他使用xmlfunction
Lua 处理单个节点的例子:这里可能是<data>
有子节点的情况,因此希望完全处理子树。
答案1
环境userdata
基于buffer
机制,在其他命令的参数中无法正常工作(所有setups
环境都只是花哨的宏定义)。
链接的 XML 页面已经提供了一些有关如何userdata
借助\xmlfunction
命令使用的提示。
\startluacode
function xml.functions.userdata(t)
context.startuserdata({"xyz"})
lxml.flush(t)
context.stopuserdata()
end
\stopluacode
\startxmlsetups xml:data
\pushcatcodetable
\setcatcodetable\ctxcatcodes
\xmlfunction{#1}{userdata}
\popcatcodetable
\stopxmlsetups