2008-10-01 46 views

回答

5

几年前,我不得不自己解决这个问题。我管理它的唯一方法是创建一个包含节点列表中的节点的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相应的参数,当然。

请注意,您可能不需要额外的XmlDocument。你可以在根XmlNode实例上调用CreateNavigator(),并使用你现有的XmlDocument来创建元素(我之前写过这段代码,从那时起我学到了更多东西 - 但是我知道上面的代码工作,我没有尝试了任何替代品)。

0

最后说明最有用,我已经将XmlNodeList转换为XmlDocument,因此可以在那里使用Navigator并将其创建为XPathNodeIterator。

感谢您的帮助!

+0

你是不是欢迎。我记得当我试图解决这个问题时,我感到非常沮丧。 – 2008-10-01 14:18:52

0

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

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

代替

myXmlNode.SelectNodes(xpath, nsmgr) 

我使用

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

获得创建XPathNodeIterator而不是XmlNodeList中。第二个代码的结果XPathNodeIterator现在可以正确添加为XsltArgumentsList的参数值。