Как реализовать преобразование 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);
  ...
}
Другие вопросы по тегам