如何使用LibXML2实现XMLDSIG的XPath转换?

时间:2012-10-18 19:12:22

标签: xml xpath libxml2 xml-dsig

我正在尝试从XPath transform实施XMLDSIG spec,由于我不会涉及的一些问题,我不能使用任何其他库(例如xmlsec })。

规范声明给出XPath表达式:

  

对输入节点集中的每个节点计算一次XPath表达式....结果转换为布尔值。如果布尔值为true,则该节点包含在输出节点集中。如果布尔值为false,则从输出节点集中省略该节点。

我知道如何解析文档,创建XPath上下文对象,根据文档根目录中的上下文计算表达式,并取消链接表达式未选择的所有元素,但这不符合标准要求。 如何使用XPath上下文对象“遍历”xmlDoc,在每个节点评估XPath表达式并有选择地删除节点?

1 个答案:

答案 0 :(得分:0)

我最终找到了解决方案。需要手动设置上下文以使其工作。这是一些骨架代码,减去错误检查:

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);
  ...
}