深入探索XSLT:XML转换的强大工具
发布时间: 2025-08-17 01:16:12 阅读量: 1 订阅数: 3 


ASP.NET与XML开发指南
# 深入探索XSLT:XML转换的强大工具
## 1. 什么是XSLT
在XML规范的发展过程中,人们意识到需要一种方法将XML文档转换为不同的格式。因为在实际应用中,处理XML文档的应用程序可能需要以不同于文档指定的格式来显示或组织数据。如果仅依靠XML解析器和编程语言以编程方式将XML文档转换为适当的格式,那么XML语言跨平台和语言独立的优势就会丧失。
为了满足这种转换需求,可扩展样式表语言转换(XSLT)应运而生。1999年11月,XSLT 1.0版本在W3C达到推荐状态,如今许多XML解析器都提供了完整的XSLT支持,.NET框架也完全符合XSLT 1.0规范。
XSLT的实用性体现在它能够将XML文档转换为多种不同的格式,这些格式可以被各种设备使用,包括浏览器、个人数字助理(PDA)、支持Web的手机等。此外,当XML文档的结构与接收其数据的应用程序不匹配时,XSLT也能发挥作用。例如,一个XML文档可能包含适合导入数据库的数据,但结构不符合应用程序的预期,使用XSLT可以将其转换为更适合应用程序处理的结构。
以下是一个简单的示例,展示了如何使用XSLT将一个包含属性的XML文档转换为基于元素的XML文档:
**原始XML文档**:
```xml
<?xml version="1.0"?>
<root>
<row id="1" fname="Dan" lname="Wahlin"/>
<row id="2" fname="Heedy" lname="Wahlin"/>
<row id="3" fname="Danny" lname="Wahlin"/>
<row id="4" fname="Jeffery" lname="Wahlin"/>
</root>
```
**转换后的XML文档**:
```xml
<?xml version="1.0"?>
<root>
<row>
<id>1</id>
<fname>Dan</fname>
<lname>Wahlin</lname>
</row>
<row>
<id>2</id>
<fname>Heedy</fname>
<lname>Wahlin</lname>
</row>
<row>
<id>3</id>
<fname>Danny</fname>
<lname>Wahlin</lname>
</row>
<row>
<id>4</id>
<fname>Jeffery</fname>
<lname>Wahlin</lname>
</row>
</root>
```
## 2. 转换过程
将XML文档转换为另一种格式(如HTML或WML)的过程依赖于两种处理引擎:
1. **XML解析器**:能够加载XML文档,并将源文档加载到DOM树结构中。
2. **XSLT处理器**:需要加载XSLT文档并为其创建树结构,该树结构通常会针对XSLT处理进行优化,且特定于所使用的处理器。然后,XSLT处理器会将XML文档结构中的节点与XSLT文档中的“模板”进行匹配,并输出结果文档。
以下是XSLT转换过程的mermaid流程图:
```mermaid
graph LR
A[XML文档] --> B[XML解析器]
B --> C[DOM树结构]
D[XSLT文档] --> E[XSLT处理器]
C --> E
E --> F[结果文档]
```
## 3. XSLT模板
XSLT文档的构建块是模板。虽然XSLT代表可扩展样式表语言转换,但它也可以被称为可扩展模板语言转换,因为它依赖模板来处理和创建特定的输出结构。
模板规则由两部分组成:
- **模式(pattern)**:与源树中的节点进行匹配。
- **模板(template)**:可以实例化以形成结果树的一部分。
XSLT处理器会尝试将XML文档中的元素或属性名称与XSLT文档中的模板进行匹配,这个匹配过程使用嵌入在XSLT文档中的XPath表达式。当XML文档中的节点与XSLT文档中的模板匹配时,该模板将被处理。
模板处理通常从与XML文档根节点匹配的模板开始,然后向下处理其子节点。处理模板时,输出将添加到用于构建输出文档的第三棵树结构中。
## 4. 初探XSLT
下面通过一个简单的示例,展示如何使用XSLT将XML文档转换为HTML,以便在浏览器中显示。
### 4.1 XML文档示例
```xml
<?xml version="1.0" ?>
<golfers>
<golfer skill="excellent" handicap="10" clubs="Taylor Made" id="1111">
<name>
<firstName>Heedy</firstName>
<lastName>Wahlin</lastName>
</name>
<favoriteCourses>
<course city="Pinetop" state="AZ" name="Pinetop Lakes CC"/>
<course city="Phoenix" state="AZ" name="Ocotillo"/>
<course city="Snowflake" state="AZ" name="Silver Creek"/>
</favoriteCourses>
</golfer>
<golfer skill="moderate" handicap="12" clubs="Taylor Made" id="2222">
<name>
<firstName>Dan</firstName>
<lastName>Wahlin</lastName>
</name>
<favoriteCourses>
<course city="Pinetop" state="AZ" name="Pinetop Lakes CC"/>
<course city="Pinetop" state="AZ" name="White Mountain CC"/>
<course city="Springville" state="UT" name="Hobble Creek"/>
</favoriteCourses>
</golfer>
</golfers>
```
### 4.2 XSLT文档示例
```xml
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes" method="html"/>
<xsl:template match="/">
<html>
<head>
<style type="text/css">
.blackText {font-family:arial;color:#000000;}
.largeYellowText {font-family:arial;font-size:18pt;color:#ffff00;}
.largeBlackText {font-family:arial;font-size:14pt;color:#000000;}
.borders {border-left:1px solid #000000;border-right:1px solid #000000;border-top:1px solid #000000;border-bottom:1px solid #000000;}
</style>
</head>
<body bgcolor="#ffffff">
<span class="largeBlackText"><b>Golfers: </b></span>
<p/>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="golfers">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="golfer">
<table class="borders" border="0" width="640" cellpadding="4" cellspacing="0" bgcolor="#efefef">
<xsl:apply-templates select="name"/>
<tr class="blackText">
<td width="12%" align="left"><b>Skill: </b></td>
<td width="12%" align="left">
<xsl:value-of select="@skill"/>
</td>
<td width="12%" align="left"><b>Handicap: </b></td>
<td width="12%" align="left">
<xsl:value-of select="@handicap"/>
</td>
<td width="12%" align="left"><b>Clubs: </b></td>
<td width="40%" align="left">
<xsl:value-of select="@clubs"/>
</td>
</tr>
<tr>
<td colspan="6"> </td>
</tr>
<tr class="blackText">
<td colspan="6" class="largeBlackText">
Favorite Courses
</td>
</tr>
<tr>
<td colspan="2"><b>City: </b></td>
<td colspan="2"><b>State: </b></td>
<td colspan="2"><b>Course: </b></td>
</tr>
<xsl:apply-templates select="favoriteCourses"/>
</table>
<p/>
</xsl:template>
<xsl:template match="name">
<tr>
<td colspan="6" class="largeYellowText" bgcolor="#02027a">
<xsl:value-of select="firstName"/> 
<xsl:value-of select="lastName"/>
</td>
</tr>
</xsl:template>
<xsl:template match="favoriteCourses">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="course">
<tr class="blackText">
<td colspan="2" align="left">
<xsl:value-of select="@city"/>
</td>
<td colspan="2" align="left">
<xsl:value-of select="@state"/>
</td>
<td colspan="2" align="left">
<xsl:value-of select="@name"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
```
### 4.3 使用XslTransform类进行转换的代码示例
```csharp
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Xml.Xsl" %>
<%@ Import Namespace="System.Xml.XPath" %>
<script language="C#" runat="server">
public void Page_Load(Object sender, EventArgs E) {
string xmlPath = Server.MapPath("listing7.1.xml");
string xslPath = Server.MapPath("listing7.2.xsl");
// 实例化XPathDocument类
XPathDocument doc = new XPathDocument(xmlPath);
// 实例化XslTransform类
XslTransform transform = new XslTransform();
transform.Load(xslPath);
// 使用XmlTextWriter自定义输出文档的缩进格式
XmlTextWriter writer = new XmlTextWriter(Response.Output);
writer.Formatting = Formatting.Indented;
writer.Indentation = 4;
transform.Transform(doc, null, writer);
}
</script>
```
执行上述代码后,XML文档将被转换为HTML,可以在浏览器中
0
0
相关推荐










