Как реализовать преобразование XPath XMLDSIG с использованием LibXML2?
Я пытаюсь реализовать преобразование XPath из спецификации XMLDSIG, и из-за нескольких проблем, в которые я не буду вдаваться, я не могу использовать дополнительные библиотеки (например, xmlsec).
В спецификации говорится, что дано выражение XPath:
Выражение XPath... вычисляется один раз для каждого узла во входном наборе узлов. Результат конвертируется в логическое значение. Если логическое значение равно true, то узел включается в выходной набор узлов. Если логическое значение равно false, то узел исключается из выходного набора узлов.
Я знаю, как анализировать в документе, создавать объект контекста XPath, оценивать выражение по контексту из корня документа и отсоединять все элементы, не выбранные выражением, но это не совсем то, что требует стандарт. Как использовать объект контекста XPath для "обхода" xmlDoc, оценки выражения XPath на каждом узле и выборочного удаления узла?
1 ответ
В конце концов я нашел решение. Чтобы контекст работал, нужно вручную поэкспериментировать с контекстом. Вот некоторый скелетный код без проверки ошибок:
result = xmlXPathEvalExpression(BAD_CAST "(//. | //@* | //namespace::*)", context);
...
compiled = xmlXPathCompile(BAD_CAST expression);
...
for (i = result->nodesetval->nodeNr - 1; i >= 0; i--)
{
...
result->node = result->nodesetval->nodeTab[i];
rc = xmlXPathCompiledEvalToBoolean(compiled, context);
...
}