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、PDF 或其他格式。对于编程初学者而言,XSLT 可能显得抽象且难以入手,但掌握其核心逻辑后,便能快速实现数据格式的“变形术”。本文将通过实例解析、分步演示和类比讲解,帮助读者逐步构建 XSLT 的应用能力。


XSLT 的基础概念与工作原理

XML、XSLT 和 XPath 的关系

想象 XML 是一份精心准备的食材清单,XSLT 则是将这些食材转化为成品的“菜谱”,而 XPath 是在菜谱中寻找特定食材的“导航仪”。三者共同协作,完成数据的转换任务:

  • XML(可扩展标记语言):存储结构化数据的基础载体。
  • XSLT:定义数据转换规则的样式表语言。
  • XPath:在 XML 文档中定位和检索节点的查询语言。

XSLT 的工作流程

XSLT 的转换过程可分解为三个步骤:

  1. 解析 XML 文档:读取原始 XML 数据结构。
  2. 应用 XSLT 模板:根据样式表的规则匹配并处理节点。
  3. 生成目标格式:输出 HTML、文本或其他格式的内容。

这一过程类似将原始食材(XML)按照菜谱(XSLT)分步骤加工,最终产出一道菜肴(目标格式)。


核心元素详解:模板、XPath 和指令

模板(Templates)

模板是 XSLT 的核心单位,通过 <xsl:template> 标签定义匹配规则。例如,以下模板会匹配 XML 中的所有 <book> 节点:

<xsl:template match="book">
  <div class="book-item">
    <h2><xsl:value-of select="title"/></h2>
    <p>Author: <xsl:value-of select="author"/></p>
  </div>
</xsl:template>

XPath 表达式

XPath 通过路径表达式定位 XML 节点。例如:

  • //book:匹配所有 <book> 节点。
  • /library/books/book[1]:匹配 <library> 根元素下的第一个 <book>

常用 XPath 函数: | 函数 | 作用描述 | 示例 | |---------------------|------------------------------|--------------------------| | string() | 将节点值转换为字符串 | <xsl:value-of select="string(123)"/> | | concat() | 合并字符串 | concat('Hello', ' ', 'World') | | position() | 返回当前节点的位置索引 | position() > 2 |

指令与流程控制

XSLT 提供了 <xsl:if><xsl:for-each> 等指令来控制逻辑流。例如:

<xsl:if test="price > 50">
  <span class="high-price">Price: <xsl:value-of select="price"/></span>
</xsl:if>

实例 1:将 XML 转换为 HTML 表格

场景描述

假设我们有一个图书库存的 XML 数据,需要将其转换为 HTML 表格。原始 XML 如下:

<library>
  <books>
    <book>
      <title>Effective Java</title>
      <author>Joshua Bloch</author>
      <price>45.99</price>
    </book>
    <book>
      <title>Clean Code</title>
      <author>Robert C. Martin</author>
      <price>39.99</price>
    </book>
  </books>
</library>

XSLT 转换代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!-- 匹配根元素 library -->
  <xsl:template match="/library">
    <html>
      <body>
        <table border="1">
          <tr>
            <th>Title</th>
            <th>Author</th>
            <th>Price</th>
          </tr>
          <!-- 遍历所有 book 节点 -->
          <xsl:for-each select="books/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:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

输出结果

转换后的 HTML 表格将包含两行数据,结构清晰且易于展示。通过 <xsl:for-each> 指令,XSLT 自动遍历所有 <book> 节点并生成对应的表格行。


实例 2:条件判断与动态内容生成

需求:标记高价书籍

在图书列表中,若书籍价格超过 50 美元,需用红色字体高亮显示。修改后的 XSLT 代码如下:

<xsl:template match="book">
  <tr>
    <td><xsl:value-of select="title"/></td>
    <td><xsl:value-of select="author"/></td>
    <td>
      <!-- 条件判断:价格 >50 时添加样式 -->
      <xsl:choose>
        <xsl:when test="price > 50">
          <span style="color: red;"><xsl:value-of select="price"/></span>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="price"/>
        </xsl:otherwise>
      </xsl:choose>
    </td>
  </tr>
</xsl:template>

执行效果

<book><price> 节点值为 45.99 时,价格正常显示;若值为 60.00,则会以红色字体突出显示。


高级技巧:变量与命名空间

变量(Variables)

通过 <xsl:variable> 可存储中间计算结果。例如,计算总价并显示:

<xsl:variable name="totalPrice" select="sum(//book/price)"/>
<p>Total Price: $<xsl:value-of select="$totalPrice"/></p>

命名空间(Namespaces)

当 XML 文档包含命名空间时,需在 XSLT 中声明对应前缀:

<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:lib="http://example.com/library">
  
  <!-- 匹配命名空间下的 book 节点 -->
  <xsl:template match="lib:book">
    <!-- 处理逻辑 -->
  </xsl:template>
</xsl:stylesheet>

结论:XSLT 在现代开发中的应用价值

通过以上实例,我们看到 XSLT 能够将复杂的数据转换任务转化为可读性高的样式表规则。其优势在于:

  1. 格式灵活性:支持 XML 到 HTML、CSV、PDF 等多种格式的转换。
  2. 逻辑封装性:将转换规则与原始数据分离,便于维护。
  3. 跨平台兼容性:在 Java、.NET、Node.js 等环境中均可调用。

对于编程初学者,建议从简单模板开始实践,逐步尝试条件判断和循环逻辑。中级开发者则可探索变量、命名空间等高级功能,以应对企业级数据处理需求。掌握 XSLT 实例,不仅能提升 XML 处理能力,更能为后续学习其他数据转换技术(如 JSON Schema 或 GraphQL)打下坚实基础。

最新发布