如何将xsl转换应用于C#中的单个XmlNode的示例

时间:2012-02-29 15:16:16

标签: c# xml xslt

这是我正在尝试做的事情:我有一个XmlDocument,它已经加载到内存中。我想将xsl转换应用于该文档的单个节点。

这是代码:

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

现在我需要在myNode上应用xslTransformer。任何人都可以给我看一个代码示例,这样做吗?到目前为止我所看到的只适用于输入和输出文件。

2 个答案:

答案 0 :(得分:5)

以下是一个如何执行此操作的示例,取自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

请注意

当您转换XmlDocumentXPathDocument对象中包含的数据时,XSLT转换将作为一个整体应用于文档。换句话说,如果传入文档根节点以外的节点,则不会阻止转换过程访问已加载文档中的所有节点。要转换节点片段,必须创建一个仅包含节点片段的单独对象,并将该对象传递给Transform方法。

这就是为什么在文档的节点上应用转换可能会导致意外和不需要的结果 - 例如转换可以访问不在提供的节点的子树中的其他节点 - 例如兄弟姐妹或祖先。 / p>

这就是为什么我强烈建议您不要在任何节点(文档节点除外)上调用Transform()

答案 1 :(得分:3)

要应用转换器,可以使用Transform方法,该方法适用于实现包含XmlNode的IXPathNavigable的任何内容。有关信息,请参阅http://technet.microsoft.com/en-us/library/ms163430(v=vs.100).aspx

如果这不是您所需要的,您可以更新问题以描述您想要的输出。

编辑:请注意接受的答案(以及上面链接中的页面)中的指导,如果您传递的节点是文档的一部分,则会影响整个文档。因此,最好不要将转换应用于XML文档中的节点。