Question

J'ai un XmlNodeList dont j'ai besoin dans un format que je peux ensuite réutiliser dans une feuille de style XSLT en l'appelant à partir d'une méthode d'extension C #.

Quelqu'un peut-il aider? J'ai lu que cela pouvait avoir un rapport avec l'utilisation d'un XPathNavigator mais je suis toujours un peu coincé.

Était-ce utile?

La solution

J'ai dû résoudre ce problème moi-même il y a quelques années. La seule façon pour moi de le gérer était de créer un fragment XML contenant les nœuds de la liste de nœuds, puis de transmettre les enfants du fragment.

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));

Ensuite, vous devez bien sûr vous assurer que vous avez l'argument correspondant dans votre XSLT.

Notez que vous n’avez probablement pas besoin du XmlDocument supplémentaire. Vous pouvez simplement appeler CreateNavigator () sur l’instance racine de XmlNode et utiliser votre document XmlDocument existant pour créer l’élément (j’ai écrit ce code il ya quelque temps et j’en ai appris plus depuis - mais je sais que le code ci-dessus fonctionne, je ne l’ai pas fait. essayé des alternatives).

Autres conseils

La note à la fin était la plus utile, j'avais déjà transformé le XmlNodeList en un XmlDocument afin que je puisse simplement utiliser le navigateur là-bas et le créer en tant que XPathNodeIterator.

Merci pour votre aide!

La réponse fournie auparavant n'a pas abouti.

L'utilisation de AppendChild () pour ajouter des nœuds de XmlNodeList précédemment sélectionnés à un nouveau document a entraîné une exception lors de la tentative d'ajout de nœuds provenant d'un contexte de document différent. Plusieurs essais pour résoudre ce problème incluaient l'ajout de mon espace de noms personnalisé par défaut aux nœuds sélectionnés dans la liste. Enfin, j’ai complètement abandonné l’approche et modifié ma méthode de sélection des nœuds en instances de XmlNodeList.

Au lieu de

myXmlNode.SelectNodes( xpath, nsmgr )

j'utilise

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

pour obtenir un XPathNodeIterator au lieu de XmlNodeList. Le XPathNodeIterator résultant du second code est maintenant correctement ajouté en tant que valeur de paramètre à XsltArgumentsList.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top