C# 在C中如何将xsl转换应用于单个XmlNode的示例#
下面是我要做的:我有一个XmlDocument,它已经加载到内存中了。我想对该文档的单个节点应用xsl转换 代码如下:C# 在C中如何将xsl转换应用于单个XmlNode的示例#,c#,xml,xslt,C#,Xml,Xslt,下面是我要做的:我有一个XmlDocument,它已经加载到内存中了。我想对该文档的单个节点应用xsl转换 代码如下: var xDoc=GetXmlDocument(); var myNode=xDoc.SelectSingleNode("//node"); var xslTransformer=new XslCompiledTransform(); xslTransformer.Load(new XmlTextReader(new StringReader(myXslText))); 现
var xDoc=GetXmlDocument();
var myNode=xDoc.SelectSingleNode("//node");
var xslTransformer=new XslCompiledTransform();
xslTransformer.Load(new XmlTextReader(new StringReader(myXslText)));
现在我需要在myNode上应用xslTransformer。有人能给我举个代码示例吗?到目前为止,我所看到的仅适用于输入和输出文件。要应用转换器,请使用Transform方法,该方法适用于任何实现IXPathNavigable(包括XmlNode)的对象。有关信息,请参阅 如果这不是您需要的,您可以更新问题以描述您想要的输出
编辑:请注意接受答案(以及上面链接中的页面)中的指导,如果您在其中传递一个节点,该节点是文档的一部分,则可能会影响整个文档。因此,最好不要将转换应用于XML文档中的节点。下面是一个示例,该示例取自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));
有关更多信息,请参阅:
注意事项:
// 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));
当您转换XmlDocument
或XPathDocument
对象中包含的数据时,XSLT转换将应用于整个文档。换句话说,如果传入文档根节点以外的节点,这不会阻止转换过程访问加载文档中的所有节点。要转换节点片段,必须创建仅包含节点片段的单独对象,并将该对象传递给transform方法
这就是为什么在文档的一个节点上应用转换可能会导致意外和不想要的结果——例如,转换可以访问不在提供的节点子树中的其他节点,例如兄弟节点或祖先节点
这就是为什么我强烈建议不要在任何节点(文档节点除外)上简单地调用
Transform()
。请注意,我的回答没有说您可以在文档中使用该节点而不会产生任何后果。我所说的是,您可以将节点传递到Transform方法中。我所包含的链接有关于它的指导,包括您上面关于影响文档的完整报价。我对你的答案投了赞成票,因为你的答案更清楚this@KAJ:是的,谢谢,也谢谢你编辑你的答案。