XSLT 编辑 XML 的基本概念
XSLT(Extensible Stylesheet Language Transformations)是一种用于转换 XML 文档的语言。它可以将 XML 文档转换为其他格式,如 HTML、文本或另一个 XML 文档。XSLT 使用 XPath 表达式在 XML 文档中导航和选择节点。
XSLT 的基本结构
XSLT 样式表通常以 .xsl 或 .xslt 为扩展名。一个基本的 XSLT 样式表包含以下部分:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<!– 转换逻辑 –>
</xsl:template>
</xsl:stylesheet>
使用 XSLT 编辑 XML 的常见操作
选择节点并输出
XSLT 可以通过 xsl:value-of 选择并输出节点的值。
<xsl:template match="/">
<root>
<xsl:value-of select="book/title"/>
</root>
</xsl:template>
循环遍历节点
使用 xsl:for-each 可以遍历 XML 文档中的多个节点。
<xsl:template match="/">
<books>
<xsl:for-each select="library/book">
<book>
<title><xsl:value-of select="title"/></title>
<author><xsl:value-of select="author"/></author>
</book>
</xsl:for-each>
</books>
</xsl:template>
条件判断
XSLT 支持条件判断,使用 xsl:if 或 xsl:choose。
<xsl:template match="/">
<books>
<xsl:for-each select="library/book">
<xsl:if test="price > 20">
<expensive-book>
<xsl:value-of select="title"/>
</expensive-book>
</xsl:if>
</xsl:for-each>
</books>
</xsl:template>
修改节点值
通过 XSLT 可以修改 XML 节点的值。
<xsl:template match="/">
<books>
<xsl:for-each select="library/book">
<book>
<title><xsl:value-of select="title"/></title>
<discounted-price>
<xsl:value-of select="price * 0.9"/>
</discounted-price>
</book>
</xsl:for-each>
</books>
</xsl:template>
添加新节点
可以在转换过程中添加新的节点。
<xsl:template match="/">
<books>
<xsl:for-each select="library/book">
<book>
<xsl:copy-of select="title"/>
<xsl:copy-of select="author"/>
<category>Fiction</category>
</book>
</xsl:for-each>
</books>
</xsl:template>
删除节点
通过不选择某些节点,可以间接实现删除效果。
<xsl:template match="/">
<books>
<xsl:for-each select="library/book">
<book>
<title><xsl:value-of select="title"/></title>
<!– 不选择 author 节点 –>
</book>
</xsl:for-each>
</books>
</xsl:template>
实际应用示例
假设有以下 XML 文件 library.xml:
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book>
<title>The Great Gatsby</title>
<author>F. Scott Fitzgerald</author>
<price>15.99</price>
</book>
<book>
<title>1984</title>
<author>George Orwell</author>
<price>12.99</price>
</book>
</library>
转换为 HTML
使用 XSLT 将 XML 转换为 HTML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<html>
<body>
<h1>Book List</h1>
<table border="1">
<tr>
<th>Title</th>
<th>Author</th>
<th>Price</th>
</tr>
<xsl:for-each select="library/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>
过滤和排序
过滤价格高于 13 的书籍并按标题排序:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<expensive-books>
<xsl:for-each select="library/book[price > 13]">
<xsl:sort select="title"/>
<book>
<xsl:copy-of select="title"/>
<xsl:copy-of select="price"/>
</book>
</xsl:for-each>
</expensive-books>
</xsl:template>
</xsl:stylesheet>
高级功能
使用命名模板
命名模板可以在多个地方重复使用。
<xsl:template name="display-book">
<xsl:param name="book"/>
<div class="book">
<h2><xsl:value-of select="$book/title"/></h2>
<p>Author: <xsl:value-of select="$book/author"/></p>
</div>
</xsl:template>
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="library/book">
<xsl:call-template name="display-book">
<xsl:with-param name="book" select="."/>
</xsl:call-template>
</xsl:for-each>
</body>
</html>
</xsl:template>
使用变量
XSLT 支持变量,但变量一旦赋值不可更改。
<xsl:template match="/">
<xsl:variable name="total" select="sum(library/book/price)"/>
<total-price>
<xsl:value-of select="$total"/>
</total-price>
</xsl:template>
总结
XSLT 是一种强大的 XML 转换语言,可以用于编辑、转换和操作 XML 文档。通过 XPath 表达式,可以灵活地选择和处理 XML 节点。XSLT 支持循环、条件判断、变量和模板等高级功能,适用于复杂的 XML 处理任务。



