我有一个 XmlNodeList,我需要将其设置为一种格式,然后通过从 C# 扩展方法调用它,我可以在 XSLT 样式表中重新使用它。
任何人都可以帮忙吗?我读过它可能与使用 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。