如何将 XSL 转换应用于 XML
此示例阐释如何使用 XslTransform 类将可扩展样式表语言转换 (XSLT) 文件应用于 XML 文档。该类实现 WWW 联合会 (W3C) 的 W3C XSL 转换 (XSLT) 1.0 版规范。(有关更一步的参考信息,您可以参阅 W3C 的 W3C 可扩展样式表语言 (XSL) 1.0 版规范。)
[运行示例] | [查看源代码] |
XSLT 是一种基于 XML 的语言,用于将一个 XML 文档转换为另一个 XML 文档,或将一个 XML 文档转换为其他的结构化文档。XSLT 使用 XML 路径语言 (XPath) 在 XML 文档上执行查询,以指定该文档的特定部分。(有关如何使用 XPath 查询 XML 文档的示例,请参阅如何使用 XPath 表达式查询 XML 文档。)
XML 文档的结构常常与处理 XML 数据所需的结构不匹配。要将现有结构转换为可处理的结构,您需要使用 XSLT 处理器和定义如何进行转换的 XSLT 样式表(或 XSLT 文件)。XSLT 文件由一些模板组成,这些模板指定源 XML 文档中的每个节点应以何种方式出现在目标 XML 文档中。因此,XSLT 处理器有三种树:
- 一种是源 XML 树
- 一种是目标结构树
- 一种是 XSLT 文件树
下列关系图说明了转换过程:接收 XML 文档,将 XSLT 文件应用于该 XML 文档的节点,然后生成另一个所需格式的文档。
此示例由两个函数组成。第一个函数只读取 XML 文档,然后使用 XSLT 文件转换数据。第二个函数读取 XML 文档,转换数据,然后用转换后的数据编写一个新的 XML 文档。
该示例将这两个函数应用于三组文档:
- 第一组文档是 XML 文档 books.xml 和 XSLT 文件 books.xsl。XSLT 文件由一些模板组成,它们获取书店元素中的所有书籍,然后为每个书籍元素获取 ISBN 属性和价格元素的值。还有一个模板,它指示 XSLT 处理器从根(“/”)节点开始处理。
- 第二组文档是 XML 文档 ProcessParametersA.xml 和 XSLT 文件 StyleSheetGenerator.xsl。在这种情况下,该示例读取 XML 文档以得出要使用包含在 XSLT 文件中的两个样式表中的哪一个。然后,该示例生成指定的样式表。
- 第三组文档是 XML 文档 ProcessParametersB.xml 和 XSLT 文件 StyleSheetGenerator.xsl。该示例处理这些文档的方式与处理第二组文档的方式相同。然而,在这种情况下,该示例生成不同的样式表。
下列代码显示两个函数中的第一个。该函数只读取并转换数据。为此,该函数首先创建一个 XPathDocument 对象和一个 XslTransform 对象。然后,使用 Load 方法将 XSLT 文件加载到 XslTransform 对象中。为启动转换,该函数调用传递到 XPathDocument 中的 Transform 方法。转换过程返回一个 XmlReader,用于读取转换后的数据。
注意:如在如何使用 XPath 表达式查询 XML中阐述的那样,XPathDocument 类可为使用 XSLT 处理 XML 文档提供快速、高性能的缓存。
// args[0] is the xml file and args[1] is the stylesheet file. public void ReadTransform(String[] args) { try { XPathDocument myXPathDocument = new XPathDocument (args[0]); XslTransform myXslTransform = new XslTransform(); myXslTransform.Load(args[1]); XmlReader reader = myXslTransform.Transform(myXPathDocument, null); FormatXml(reader); } catch (Exception e) { Console.WriteLine ("Exception: {0}", e.ToString()); } }
C# VB 除了从转换中返回 XmlReader 外,还可能将 XmlWriter 提供给 Transform 方法。提供一个编写器可使转换后的数据写入文件或流中。在此示例中,两个函数中的第二个显示如何将 XmlWriter 包括在转换过程中。下列代码显示第二个函数如何将转换后的数据写入名为 transform.xml 的文件,然后将此文件输出到控制台。
// args[0] is the xml file and args[1] is the stylesheet file. public void ReadTransformWrite(String[] args) { StreamReader stream = null; try { XPathDocument myXPathDocument = new XPathDocument (args[0]); XslTransform myXslTransform = new XslTransform(); XmlTextWriter writer = new XmlTextWriter("transform.xml", null); myXslTransform.Load(args[1]); myXslTransform.Transform(myXPathDocument, null, writer); writer.Close(); stream = new StreamReader ("transform.xml"); Console.Write(stream.ReadToEnd()); } catch (Exception e) { Console.WriteLine ("Exception: {0}", e.ToString()); } finally { if (stream != null) stream.Close(); } }
C# VB 虽然没有在此示例中显示出来,但您可以使用 XslTransform 的 Transform 方法加载文档并直接写入文件。这是一个从文件加载 XML 文档、应用 XSLT 文件并将输出写到文件的简便方法。这样可以使用户不必创建并加载输入源文档,然后写入文件流。该方法使用 XPathDocument 转换 XML,如下列代码所示。
XslTransform xsltransform = new XslTransform(); xsltransform.Load("favorite.xsl"); xsltransform.Transform("MyDocument.xml", "TransformResult.xml");
C# VB 摘要
- XSLT 是一种使用 XPath 作为查询语言,将 XML 文档转换成其他 XML 文档的语言。
- 使用 XslTransform 类的 Load 方法可以加载 XSLT 样式表(或 XSLT 文件)。
- XslTransform 类的 Transform 方法使用 XPathDocument,并且返回一个 XmlReader,或者将转换写入所提供的 XmlWriter 或流。
- XslTransform 类可转换任何实现 XPathNavigator 和 IXPathNavigable 接口的数据。
- 您可以组合 XSLT 文件以生成所需的结构输出格式(如 XML 或 HTML)。
- XSLT 处理器不操作文档。它们操作文档结构。