XSLT 教程(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

什么是 XSLT?

XSLT(可扩展样式表语言转换)是一种用于将 XML 数据转换为其他格式(如 HTML、文本或另一种 XML)的编程语言。它类似于 CSS 在网页设计中的作用,但功能更为强大,能够根据复杂的逻辑规则重构数据结构。

想象一下,XML 是一本用特定符号标记的“原始资料”,而 XSLT 就像一位“翻译官”,能将这些资料转换成读者更易理解的语言——无论是 HTML 页面、JSON 格式,还是其他任何格式。这种转换能力在数据集成、文档生成和 API 响应处理等场景中至关重要。

为什么需要学习 XSLT?

  • 跨平台兼容性:XSLT 是 W3C 标准,可在多种编程语言(如 Java、Python、C#)和工具中使用。
  • 数据格式转换需求:许多企业系统仍依赖 XML 作为数据交换格式,XSLT 能高效完成格式转换。
  • 动态内容生成:通过条件判断和循环,可以实现基于 XML 数据的动态页面渲染。

XSLT 基础语法与核心概念

1. XML 文档结构与 XSLT 的关系

XML 文件由标签、属性和文本内容组成,例如:

<books>  
  <book id="1">  
    <title>Design Patterns</title>  
    <author>Gamma et al.</author>  
    <price>39.99</price>  
  </book>  
</books>  

XSLT 的作用是将这样的 XML 数据转换为另一种格式。例如,可以将其转换为 HTML 表格,或提取特定字段生成 CSV 文件。

2. XSLT 文档的基本结构

一个 XSLT 样式表通常包含以下元素:

  • <xsl:stylesheet>:根元素,定义命名空间和版本。
  • <xsl:template>:定义匹配规则和转换逻辑。
  • <xsl:apply-templates>:触发子节点的转换。
  • <xsl:value-of>:提取节点的文本值。

示例 XSLT 样式表开头:

<?xml version="1.0" encoding="UTF-8"?>  
<xsl:stylesheet version="1.0"  
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  <!-- 模板规则 -->  
</xsl:stylesheet>  

3. 模板匹配(xsl:template

模板通过 match 属性指定要匹配的 XML 节点。例如:

<xsl:template match="book">  
  <div class="book-item">  
    <h3><xsl:value-of select="title"/></h3>  
    <p>作者:<xsl:value-of select="author"/></p>  
    <p>价格:<xsl:value-of select="price"/></p>  
  </div>  
</xsl:template>  

这里,match="book" 表示当处理到 XML 中的 <book> 节点时,应用该模板。


XSLT 转换流程详解

步骤 1:定义样式表

创建 XSLT 文件时,需声明命名空间和版本:

<xsl:stylesheet version="1.0"  
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  

此声明确保解析器能识别 XSLT 语法。

步骤 2:编写模板规则

通过 <xsl:template> 定义转换逻辑。例如,将 XML 转换为 HTML 列表:

<xsl:template match="/">  
  <html>  
    <body>  
      <ul>  
        <xsl:apply-templates select="books/book"/>  
      </ul>  
    </body>  
  </html>  
</xsl:template>  

这里,<xsl:apply-templates> 指示处理所有 <books> 下的 <book> 节点。

步骤 3:处理节点与输出

在子模板中,通过 <xsl:value-of> 提取数据:

<xsl:template match="book">  
  <li>  
    <strong>书名:</strong>  
    <xsl:value-of select="title"/>  
    <br/>  
    <strong>作者:</strong>  
    <xsl:value-of select="author"/>  
  </li>  
</xsl:template>  

最终输出的 HTML 可能如下:

<li>  
  <strong>书名:</strong>Design Patterns  
  <br/>  
  <strong>作者:</strong>Gamma et al.  
</li>  

XSLT 实战案例:将 XML 转换为 HTML 表格

案例背景

假设我们有以下 XML 数据,需生成包含书名、作者和价格的 HTML 表格:

<books>  
  <book id="1">  
    <title>Effective Java</title>  
    <author>Joshua Bloch</author>  
    <price>45.50</price>  
  </book>  
  <book id="2">  
    <title>Clean Code</title>  
    <author>Robert C. Martin</author>  
    <price>38.00</price>  
  </book>  
</books>  

步骤 1:创建 XSLT 样式表

<?xml version="1.0" encoding="UTF-8"?>  
<xsl:stylesheet version="1.0"  
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  

  <!-- 主模板:匹配根节点 -->  
  <xsl:template match="/">  
    <html>  
      <head>  
        <title>书籍目录</title>  
      </head>  
      <body>  
        <table border="1">  
          <tr>  
            <th>书名</th>  
            <th>作者</th>  
            <th>价格</th>  
          </tr>  
          <xsl:apply-templates select="books/book"/>  
        </table>  
      </body>  
    </html>  
  </xsl:template>  

  <!-- 处理每个 <book> 节点 -->  
  <xsl:template match="book">  
    <tr>  
      <td><xsl:value-of select="title"/></td>  
      <td><xsl:value-of select="author"/></td>  
      <td><xsl:value-of select="price"/></td>  
    </tr>  
  </xsl:template>  

</xsl:stylesheet>  

步骤 2:运行转换

通过 XSLT 处理器(如 Saxon 或在线工具)执行转换后,将生成如下 HTML:

<table border="1">  
  <tr>  
    <th>书名</th>  
    <th>作者</th>  
    <th>价格</th>  
  </tr>  
  <tr>  
    <td>Effective Java</td>  
    <td>Joshua Bloch</td>  
    <td>45.50</td>  
  </tr>  
  <tr>  
    <td>Clean Code</td>  
    <td>Robert C. Martin</td>  
    <td>38.00</td>  
  </tr>  
</table>  

XSLT 进阶技巧

1. 使用变量(xsl:variable

变量可以存储中间计算结果,避免重复查询。例如:

<xsl:template match="book">  
  <xsl:variable name="discountedPrice" select="price * 0.9"/>  
  <tr>  
    <td>...</td>  
    <td>原价:<xsl:value-of select="price"/></td>  
    <td>折扣价:<xsl:value-of select="$discountedPrice"/></td>  
  </tr>  
</xsl:template>  

2. 条件判断(xsl:ifxsl:choose

根据 XML 数据动态调整输出:

<xsl:template match="book">  
  <tr>  
    <td>...</td>  
    <td>  
      <xsl:if test="price > 40">  
        <span style="color:red">高价</span>  
      </xsl:if>  
    </td>  
  </tr>  
</xsl:template>  

3. 循环(xsl:for-each

遍历 XML 节点集合,例如处理多个作者:

<xsl:template match="book">  
  <tr>  
    <td>...</td>  
    <td>  
      <xsl:for-each select="author">  
        <xsl:value-of select="."/>  
        <xsl:if test="position() != last()">, </xsl:if>  
      </xsl:for-each>  
    </td>  
  </tr>  
</xsl:template>  

常见问题与解决方案

Q1:XSLT 转换后没有输出?

  • 可能原因:模板匹配路径错误。例如,XML 根节点是 <books>,但样式表的模板写成了 <xsl:template match="book">,导致未触发主模板。
  • 解决方法:确保 <xsl:template match="/"> 中调用了正确的 <xsl:apply-templates>

Q2:如何处理 XML 命名空间?

当 XML 包含命名空间时,需在 XSLT 中声明并引用:

<xsl:stylesheet  
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
  xmlns:ns="http://example.com/books"  
  exclude-result-prefixes="ns">  

<xsl:template match="ns:book">  
  <!-- 处理逻辑 -->  
</xsl:template>  

Q3:如何调试 XSLT?

  • 使用在线工具(如 XSLT Fiddle )实时查看转换结果。
  • 在模板中插入 <xsl:message> 输出调试信息。

结论

XSLT 是处理 XML 数据转换的强大工具,尤其适合需要跨格式数据转换的场景。通过掌握模板匹配、条件判断和循环等核心语法,开发者能够高效地将 XML 转换为 HTML、文本或其他格式。尽管 XSLT 的语法可能对新手稍显复杂,但通过本文的分步讲解和实战案例,读者可以逐步掌握其精髓。

对于希望深入学习的读者,建议尝试以下实践:

  1. 将 XML 转换为 JSON 格式;
  2. 使用变量和函数实现更复杂的计算;
  3. 结合 XPath 表达式优化数据查询。

XSLT 教程的学习将为开发者在数据集成、文档生成等领域提供重要技能支持,尤其在需要兼容旧系统或处理遗留 XML 数据时,其价值不可替代。

最新发布