我正在尝试为libxslt (c++)创建一个xslt扩展函数。我的扩展函数接受一个字符串作为输入,然后这个字符串被xml解析器解析,函数返回这个解析后的xml。我用这个表达式返回值:
void fnParse(xmlXPathParserContextPtr ctx, int nargs)
{
...
xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetCreate(node));
}
但是我发现libxslt在使用后不释放节点内存。它释放xmlNodeSet,但不释放存储在该节点集中的节点。也许我错过了什么重要的东西。在扩展函数中返回XML节点的正确方法是什么?
您必须创建并注册一个"结果值树";通过调用xsltCreateRVT和xsltRegisterLocalRVT,然后添加要返回到该树的节点。看看exsltStrTokenizeFunction这样的函数,看看它是如何工作的:
https://gitlab.gnome.org/GNOME/libxslt/-/blob/master/libexslt/strings.c