我有一个XmlNodeList,我需要它的格式,然后我可以通过从C#扩展方法调用它在XSLT样式表中重新使用它。如何将XmlNodeList转换为在XSLT中使用的NodeSet?
任何人都可以帮忙吗?我读过它可能与使用XPathNavigator有关,但我仍然有点卡住。
我有一个XmlNodeList,我需要它的格式,然后我可以通过从C#扩展方法调用它在XSLT样式表中重新使用它。如何将XmlNodeList转换为在XSLT中使用的NodeSet?
任何人都可以帮忙吗?我读过它可能与使用XPathNavigator有关,但我仍然有点卡住。
几年前,我不得不自己解决这个问题。我管理它的唯一方法是创建一个包含节点列表中的节点的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来创建元素(我之前写过这段代码,从那时起我学到了更多东西 - 但是我知道上面的代码工作,我没有尝试了任何替代品)。
最后说明最有用,我已经将XmlNodeList转换为XmlDocument,因此可以在那里使用Navigator并将其创建为XPathNodeIterator。
感谢您的帮助!
以前提供的答案没有成功。
使用AppendChild()将以前选定的XmlNodeList节点添加到新文档导致尝试附加源自不同文档上下文的节点的异常。几个试验来解决这个问题,包括在列表中添加我自定义的默认命名空间选定节点。最后,我完全放弃了这种方法,并将我选择节点的方式切换到XmlNodeList实例中。
代替
myXmlNode.SelectNodes(xpath, nsmgr)
我使用
myXmlNode.CreateNavigator().Select(xpath, nsmgr)
获得创建XPathNodeIterator而不是XmlNodeList中。第二个代码的结果XPathNodeIterator现在可以正确添加为XsltArgumentsList的参数值。
你是不是欢迎。我记得当我试图解决这个问题时,我感到非常沮丧。 – 2008-10-01 14:18:52