如何将XmlNodeList转换为NodeSet以在XSLT中使用?

时间:2008-10-01 13:21:28

标签: c# xml xslt

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

有人可以帮忙吗?我已经读过它可能与使用XPathNavigator有关,但我仍然有点卡住。

3 个答案:

答案 0 :(得分: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来创建元素(我前一段时间编写了这段代码,从那时起我学到了更多 - 但我知道上面的代码可行,但我没有尝试了任何替代方案)。

答案 1 :(得分:0)

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

谢谢你的帮助!

答案 2 :(得分:0)

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

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

而不是

myXmlNode.SelectNodes( xpath, nsmgr )

我正在使用

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

获取XPathNodeIterator而不是XmlNodeList。现在,第二个代码的结果XPathNodeIterator被正确添加为XsltArgumentsList的参数值。