基于@nwellnholf的建议我检查了transform.c,过了一段时间后我想出了如何实现它。
@nwellnholf写道,核心魔法在xsltApplySequenceConstructor
之内。为了能够使用它,有必要编辑库并公开这个函数,因为最初这个函数仅在transform.c中定义。要这样做,请在transform.h中定义并重新编译libxslt。
XSLTPUBFUN void xsltApplySequenceConstructor(xsltTransformContextPtr ctxt, xmlNodePtr contextNode, xmlNodePtr list, xsltTemplatePtr templ);
第二步是实现自己的xslt函数,继续自己的指令并返回处理回xslt。这些步骤是通过以下命令完成的:
void elemChangeContext(xsltTransformContextPtr ctxt, xmlNodePtr node, xmlNodePtr inst, xsltElemPreCompPtr /*comp*/)
{
if (ctxt == NULL || node == NULL || inst == NULL || ctxt->insert == NULL)
return;
xmlNodePtr cur = /* change context to different node */;
xmlNodePtr curInst = inst->children; //sub xslt instruction
xsltApplySequenceConstructor(ctxt,cur, curInst,NULL);
}
为什么你需要一个自定义的扩展,你不能只用'for-each'本身吗? – 2014-10-02 13:34:11
这是因为在我们的应用程序(http://www.skipper18.com)中使用了非常复杂的转换,部分XSLT函数已被C代码重写。现在,重写也是在输入XML中查找数据的函数也很方便。因此,不要与saxon一起串接字符串:例如,执行我们自己的<...> ann:find-data>。很难用几句话来形容,但希望它是可以理解的。 –
2014-10-02 13:50:26