如何将XmlNodeList转换为要在XSLT中使用的NodeSet

本文关键字:XSLT NodeSet XmlNodeList 转换 | 更新日期: 2023-09-27 17:48:53

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

有人能帮忙吗?我读到它可能与使用XPathNavigator有关,但我仍然有点停滞不前。

如何将XmlNodeList转换为要在XSLT中使用的NodeSet

几年前我不得不自己解决这个问题。我管理它的唯一方法是创建一个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中。