Пример того, как применить преобразование xsl к одному XmlNode в C # - PullRequest
2 голосов
/ 29 февраля 2012

Вот что я пытаюсь сделать: у меня есть XmlDocument, который уже загружен в память.Я хочу применить преобразование xsl к одному узлу этого документа.

вот код:

var xDoc=GetXmlDocument();
var myNode=xDoc.SelectSingleNode("//node");
var xslTransformer=new XslCompiledTransform(); 
xslTransformer.Load(new XmlTextReader(new StringReader(myXslText)));

Теперь мне нужно применить xslTransformer к myNode.Может кто-нибудь показать мне пример кода, который это делает?То, что я видел до сих пор, работает только с файлами ввода и вывода.

Ответы [ 2 ]

5 голосов
/ 29 февраля 2012

Вот пример того, как это сделать, взятый из документации MSDN :

// Load an XPathDocument.
XPathDocument doc = new XPathDocument("books.xml");

// Locate the node fragment.
XPathNavigator nav = doc.CreateNavigator();
XPathNavigator myBook = nav.SelectSingleNode("descendant::book[@ISBN = '0-201-63361-2']");

// Create a new object with just the node fragment.
XmlReader reader = myBook.ReadSubtree();
reader.MoveToContent();

// Load the style sheet.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("single.xsl");

// Transform the node fragment.
xslt.Transform(reader, XmlWriter.Create(Console.Out, xslt.OutputSettings));

Для получения дополнительной информации см .: http://technet.microsoft.com/en-us/library/wkx4fcc4.aspx

Обратите внимание :

При преобразовании данных, содержащихся в объекте XmlDocument или XPathDocument, преобразования XSLT применяются к документу в целом.Другими словами, если вы передадите узел, отличный от корневого узла документа, это не помешает процессу преобразования получить доступ ко всем узлам в загруженном документе.Чтобы преобразовать фрагмент узла, необходимо создать отдельный объект, содержащий только фрагмент узла, и передать этот объект в метод Transform.

Именно поэтому применение преобразования к узлу документа может привести кнеожиданные и нежелательные результаты - например, преобразование может получить доступ к другим узлам, которые не входят в поддерево предоставленного узла - например, к братьям и сестрам или предкам.

Именно поэтому я настоятельно рекомендую не простовызовите Transform() на любом узле (кроме узла-документа).

3 голосов
/ 29 февраля 2012

Чтобы применить преобразователь, вы используете метод Transform, который работает на всем, что реализует IXPathNavigable, который включает в себя XmlNode. См. http://technet.microsoft.com/en-us/library/ms163430(v=vs.100).aspx для информации.

Если это не то, что вам нужно, вы можете обновить вопрос, чтобы описать, что вы хотите получить.

РЕДАКТИРОВАТЬ: обратите внимание на указание в принятом ответе (и на странице в ссылке выше), что если вы передадите узел, который является частью документа, это может повлиять на весь документ. Поэтому лучше не применять преобразование к узлу внутри документа XML.

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