xmlXPathCompOpEval: набор узлов функции не найден

Я реализую несколько библиотек (libxslt, libxml2, libexslt) для обработки XSLT в своей программе. Я включил файлы заголовков и файлы .so, чтобы связать библиотеки с программой, и обнаружил, что связывание работает хорошо.

Ниже приведен код, использующий некоторые функции библиотеки для реализации обработки XSLT в моей программе, и в результате первые две строки работали хорошо, но в последней строке была сгенерирована ошибка.

style=xsltParseStylesheetFile(stylesheetfile);
input=xmlParseFile(inputfile);
output=xsltApplyStylesheet(style, input,0); //error

// ошибка
xmlXPathCompOpEval: набор узлов функции не найден
Ошибка XPath: незарегистрированная функция

Та же обработка XSLT хорошо работала с использованием xsltproc, который представляет собой версию libxslt для командной строки и те же файлы XML (входной файл) и XSL (файл таблицы стилей) на моем компьютере, но реализация не сработает.

Я знаю, что функция набора узлов находится в libexslt. Но почему не работает? Это проблема связывания библиотеки? Особенно libexslt? или конфигурация? Вы знаете какое-нибудь решение этой ошибки? Был бы очень признателен за вашу помощь. Спасибо.


person BcFlower    schedule 24.11.2018    source источник
comment
Вы звонили exsltRegisterAll();, как это делает xsltproc на gitlab.gnome? .org / GNOME / libxslt / blob / master / xsltproc /? Насколько я понимаю, включение только заголовков и ссылок на библиотеки не позволяет использовать функции расширения. Для использования функции node-set, конечно, достаточно зарегистрировать общие функции расширения.   -  person Martin Honnen    schedule 24.11.2018
comment
@MartinHonnen Нет, я не звонил exsltRegisterAll(); Теперь я вызвал функцию, и она сработала. Большое спасибо, я очень ценю это :)   -  person BcFlower    schedule 26.11.2018
comment
Я превратил предложение из комментария в ответ, чтобы вы могли отметить свой вопрос как решенный.   -  person Martin Honnen    schedule 26.11.2018


Ответы (1)


Включение заголовков и связывание с соответствующими библиотеками само по себе не позволяет использовать функции расширения, поскольку вы упомянули, что xsltproc, поддерживающий их, см. Его исходный код по адресу https://gitlab.gnome.org/GNOME/libxslt/blob/master/xsltproc/xsltproc.c#L803 где это звонки

exsltRegisterAll();

для включения соответствующей регистрации всех функций расширения EXSLT в процессоре XSLT.

person Martin Honnen    schedule 26.11.2018