这是我正在尝试做的事情:我有一个XmlDocument,它已经加载到内存中.我想将xsl转换应用于该文档的单个节点.
这是代码:
var xDoc=GetXmlDocument();
var myNode=xDoc.SelectSingleNode("//node");
var xslTransformer=new XslCompiledTransform();
xslTransformer.Load(new XmlTextReader(new StringReader(myXslText)));
Run Code Online (Sandbox Code Playgroud)
现在我需要在myNode上应用xslTransformer.任何人都可以给我看一个代码示例,这样做吗?到目前为止我所看到的只适用于输入和输出文件.
以下是从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));
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅:http://technet.microsoft.com/en-us/library/wkx4fcc4.aspx
请注意:
转换包含在对象XmlDocument或XPathDocument对象中的数据时,XSLT转换将作为整体应用于文档.换句话说,如果传入文档根节点以外的节点,则不会阻止转换过程访问已加载文档中的所有节点.要转换节点片段,必须创建仅包含节点片段的单独对象,并将该对象传递给Transform方法.
这就是为什么在文档的节点上应用转换可能会导致意外和不需要的结果 - 例如转换可以访问不在提供的节点的子树中的其他节点 - 例如兄弟姐妹或祖先.
这就是为什么我强烈建议不要简单地调用Transform()任何节点(文档节点除外).