ConTeXt:XML 处理和缓冲区

ConTeXt:XML 处理和缓冲区

我知道缓冲区和宏不能很好地协同工作,所以我从逐字 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

我发现其他使用xmlfunctionLua 处理单个节点的例子:这里可能是<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

相关内容