Как мне преобразовать XmlNodeList в NodeSet для использования в XSLT? - PullRequest
2 голосов
/ 01 октября 2008

У меня есть XmlNodeList, который мне нужен, чтобы иметь его в формате, который я могу затем повторно использовать в таблице стилей XSLT, вызывая его из метода расширения C #.

Кто-нибудь может помочь? Я читал, что это может быть связано с использованием XPathNavigator, но я все еще немного застрял.

Ответы [ 3 ]

5 голосов
/ 01 октября 2008

Я должен был решить эту проблему сам пару лет назад. Единственный способ, которым мне удалось это сделать, - создать фрагмент 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. Вы можете просто вызвать CreateNavigator () для корневого экземпляра XmlNode и использовать существующий XmlDocument для создания элемента (я написал этот код некоторое время назад и с тех пор узнал больше - но я знаю, что приведенный выше код работает, я не пробовал любые альтернативы).

0 голосов
/ 19 марта 2012

Не удалось получить ответ, предоставленный ранее.

Использование AppendChild () для добавления ранее выбранных узлов XmlNodeList в новый документ привело к исключению при попытке добавить узлы, происходящие из другого контекста документа. Несколько попыток исправить это включали добавление моего пользовательского пространства имен по умолчанию, к которому привязаны выбранные узлы в списке. Наконец, я полностью отбросил подход и переключил способ выбора узлов на экземпляры XmlNodeList.

Вместо

myXmlNode.SelectNodes( xpath, nsmgr )

Я использую

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

чтобы получить XPathNodeIterator вместо XmlNodeList. Результирующий XPathNodeIterator второго кода теперь правильно добавлен в качестве значения параметра в XsltArgumentsList.

0 голосов
/ 01 октября 2008

Примечание в конце было самым полезным, я уже фактически преобразовал XmlNodeList в XmlDocument, так что я мог просто использовать там Навигатор и создать его как XPathNodeIterator.

Спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...