代码之家  ›  专栏  ›  技术社区  ›  chrisntr

如何将xmlnodelist转换为要在XSLT中使用的节点集?

  •  2
  • chrisntr  · 技术社区  · 16 年前

    我有一个xmlnodelist,我需要它的格式,然后我可以通过从C扩展方法调用它来在XSLT样式表中重用它。

    有人能帮忙吗?我读过,这可能与使用XpathNavigator有关,但我还是有点困。

    3 回复  |  直到 9 年前
        1
  •  5
  •   Jeff Yates    16 年前

    几年前我不得不自己解决这个问题。我管理它的唯一方法是创建一个包含节点列表中节点的XML片段,然后传入片段的子级。

    XsltArgumentList arguments = new XsltArgumentList();
    XmlNodeList nodelist;
    XmlDocument nodesFrament = new XmlDocument();
    XmlNode root = nodesFragment.CreateElement("root");
    foreach (XmlNode node in nodeList)
    {
        root.AppendChild(node);
    }
    nodesFragment.AppendChild(root);
    
    arguments.AddParam("argumentname", string.Empty, nodesFragment.CreateNavigator().SelectChildren(XPathNodeType.All));
    

    当然,您需要确保在您的XSLT中有相应的参数。

    请注意,您可能不需要额外的XML文档。您可以在根xmlnode实例上调用createnvigator()并使用现有的xmlnode来创建元素(我以前编写过这段代码,从那以后我学到了更多——但我知道上面的代码有效,我没有尝试过任何替代方法)。

        2
  •  0
  •   chrisntr    16 年前

    最后的注释是最有用的,我实际上已经将xmlnodelist转换成了一个xmldocument,因此可以使用上面的导航器并将其创建为xpathnodeiterator。

    谢谢你的帮助!

        3
  •  0
  •   soletan    12 年前

    之前提供的答案没有成功。

    使用AppendChild()将以前选定的xmlNodeList节点添加到新文档,导致尝试附加源自不同文档上下文的节点时出现异常。解决这个问题的一些尝试包括在列表中添加我的自定义默认名称空间选定节点。最后,我完全放弃了这种方法,并将选择节点的方式转换为xmlnodelist实例。

    而不是

    myXmlNode.SelectNodes( xpath, nsmgr )
    

    我在用

    myXmlNode.CreateNavigator().Select( xpath, nsmgr )
    

    获取xpathnodeiterator而不是xmlnodelist。生成的第二个代码的xpathnodeiterator现在作为参数值正确添加到xsltargumentslist中。