Я использую Xalan-C ++ для выполнения XSLT-преобразования и получаю ошибку сегментации в этом коде:
XalanTransformer evalTransformer;
evalTransformer.setUseValidation(false);
evalTransformer.transform(*(xmlDoc.getDocumentBuilder()), rule_, resultStream);
Ранее я использовал этот код для инициализации XalanDocumentBuilder:
// Create a XalanTransformer.
XalanTransformer theXalanTransformer;
// Get a document builder from the transformer...
docBuilder_ = theXalanTransformer.createDocumentBuilder();
а затем создать документ XML с docBuilder_
, так xmlDoc.getDocumentBuilder()
(который просто возвращает docBuilder_
) должен вернуть действительный указатель.
Если я присоединяю gdb к запущенному процессу, это первые несколько строк трассировки стека:
#0 0x0a2de894 in ?? ()
#1 0x0514f8d9 in amxalanc_1_6::XalanTransformer::doTransform () from /usr/lib/libamxalanc1_6.so
transform()
Метод работал с простым потоком вывода, но когда я изменил 1-й параметр, он теперь не работает. Я использовал объект построителя документов для успешного создания XML-документа. Любые идеи, почему я получаю ошибку сегментации в коде Xalan?
Я готовлюсь к официальному выпуску Xalan-C 1.11.
Можете ли вы опубликовать свою проблему в Apache Jira для XALANC, чтобы эту проблему можно было отследить?
https://issues.apache.org/jira/browse/XALANC
У меня также есть сайт коммитера Apache
http://www.apache.org/~shathaway
Спасибо за размещение в списке рассылки
С уважением,
Стивен Дж. Хэтэуэй
Проект документации Xalan
Версия 1.6 Xalan-C старая. Последняя стабильная версия — 1.10.
При обновлении было исправлено множество указателей на ошибки сегмента.
Готовится к выпуску новая версия 1.11
Исправлены указатели.
Если это новый код, вы должны убедиться, что ваши Xerces и Xalan
библиотеки инициализируются перед выполнением любой полезной работы.
http://xalan.apache.org/xalan-c/usagepatterns.html#xalan
С уважением,
Стивен Дж. Хэтэуэй
Проект документации Xalan
Проблема в том, что theXalanTransformer
инициализируется в другой функции. Он создан по единственной причине создания XML-документа в памяти с использованием docBuilder_
, theXalanTransformer
деструктор будет вызван в конце этой функции, и он разрушает *docBuilder_
неявно в это время также, так как *docBuilder_
создан с использованием theXalanTransformer
, Потом evalTransformer
используется для преобразования, но *docBuilder_
уже был уничтожен.
Я не поняла *docBuilder_
будет уничтожен, когда theXalanTransformer
уничтожен Когда я держал theXalanTransformer
в памяти достаточно долго, чтобы сделать преобразование, результат был успешным. Я полагаю, было бы еще лучше использовать один XalanTransformer
создать документ XML и выполнить преобразование.