Я пытаюсь добавить узел инструкции обработки в существующий документ XML, чтобы преобразование XSL было применено к документу при отображении в браузере. Я посмотрел, как это сделать, используя классы libxml++
, но не смог найти его, поэтому я попытался использовать libxml2
. Это то, что я придумал:Добавить инструкцию обработки в существующий документ XML, используя libxml ++
xmlpp::Document* Doc = Parser->get_document();
// Set processing instruction for stylesheet
const xmlNodePtr PINode = xmlNewDocPI(
Doc->cobj(),
reinterpret_cast<xmlChar*>("xml-stylesheet"),
reinterpret_cast<xmlChar*>("href=\"../stylesheet.xslt\" type=\"text/xsl\"")
);
if (PINode == NULL) {
// Never get here
}
Doc->write_to_file_formatted("mydoc.xml", "utf-8");
Узел инструкции по обработке не записан в документ. Так что мне здесь не хватает?
Это не «хакерство», это правильный способ сделать это; вам нужно указать документ WHERE, чтобы поместить любой узел; инструкция по обработке потенциально может идти куда угодно. – Flynn1179
Спасибо, что подтвердили, что это правильный способ сделать это. Я просто нашел * странным *, а не * hackish *, что местоположение узла PI должно было называться «предыдущим братом корневого узла». –
О, я понимаю, что вы имеете в виду; Я имел в виду тот факт, что вы должны были добавить его вообще. Это распространенное заблуждение, что корневой элемент является корнем документа; сам документ на самом деле является узлом XML, а корневой элемент является его дочерним элементом. Если есть способ вставить инструкцию обработки в качестве первого дочернего документа самого документа, это также должно сделать это. «Корневой узел» не является строго точным, я считаю, что вы имеете в виду корневой элемент *. Я удивлен, что библиотека libxml использует «get_root_node», что вводит в заблуждение. Я знаю, что .NET использует «DocumentElement» для одного и того же. – Flynn1179