XSLT入门 -- 第3章 实践篇

2024-04-27 22:32
文章标签 实践 入门 xslt

本文主要是介绍XSLT入门 -- 第3章 实践篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 复制

这是个复制所有节点的例子(程序1)。例如从XHTML变换成XHTML等情况,源和结果的元素大部分相同时,就可以将该实例稍作修改,仅针对需要改动的部分书写代码即可。

程序1: copy.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
使用xsl:xcopy元素将各节点进行递归复制。

 

2 行列交换

该实例可以将HTML表格的行和列进行交换(程序2)。

程序2: table.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="table">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:for-each select="tr[1]/td">
<tr>
<xsl:variable name="x" select="last()"/>
<xsl:variable name="y" select="position()-1"/>
<xsl:for-each select="../../tr/td">
<xsl:if test="(position()-1) mod $x = $y">
<td>
<xsl:value-of select="."/>
</td>
</xsl:if>
</xsl:for-each>
</tr>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
因为是交换行列,所以只需输出源表格的列数的行就可以了。在这里,使用
<xsl:for-each select="tr[1]/td">
循环,按照第一行的列数来新建行(tr元素)。使用如下循环
<xsl:for-each select="../../tr/td">
来取出各行中将要保存的数据。由于当前节点是tr[1]/td,那么使用../tdと将仅能取出第一行的td元素。为了取出所有td元素,须写成../../tr/td的形式。

 

变量x中保存新建表格的总行数,变量y中保存当前正在生成的行的行数-1。因此,

<xsl:if test="(position()-1) mod $x = $y">
使用该条件输出td元素中的数据。mod是取余数的运算符。

将如图1所示的页面(程序3)进行转换,可以得到如图2所示的输出结果。

图1: 输入页面
程序3: table.xml
<?xml version="1.0"?>
<html>
<head>
<title>表格</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
</head>
<h1>表格</h1>
<body>
<table border="1">
<tr>
<td>甲</td>
<td>乙</td>
<td>丙</td>
<td>丁</td>
<td>戊</td>
</tr>
<tr>
<td>己</td>
<td>庚</td>
<td>辛</td>
<td>壬</td>
<td>癸</td>
</tr>
</table>
</body>
</html>
图2: 输出页面

 

3 表格

表格可以看作是二维数组。让我们试着将它转换成一维数组。但是仅仅将表格内容排列出来就失去了意义,因此我们将保留原表格的行号和列号作为结果的属性值(程序4)。

程序4: databank.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<databank>
<xsl:apply-templates select=".//table"/>
</databank>
</xsl:template>
<xsl:template match="table">
<xsl:for-each select="tr">
<xsl:variable name="row" select="position()"/>
<xsl:for-each select="td">
<xsl:variable name="column" select="position()"/>
<data>
<xsl:attribute name="row">
<xsl:copy-of select="$row"/>
</xsl:attribute>
<xsl:attribute name="column">
<xsl:copy-of select="$column"/>
</xsl:attribute>
<xsl:value-of select="."/>
</data>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
将行号和列号的信息保存到变量row和column中。
<xsl:variable name="row" select="position()"/>
<xsl:variable name="column"select="position()"/>
使用row属性输出行号,column属性输出列号。
<xsl:attribute name="row">
<xsl:copy-of select="$row"/>
</xsl:attribute>
<xsl:attribute name="column">
<xsl:copy-of select="$column"/>
</xsl:attribute>
将程序3进行转换时,输出如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<databank>
<data row="1" column="1">甲</data>
<data row="1" column="2">乙</data>
<data row="1" column="3">丙</data>
<data row="1" column="4">丁</data>
<data row="1" column="5">戊</data>
<data row="2" column="1">己</data>
<data row="2" column="2">庚</data>
<data row="2" column="3">辛</data>
<data row="2" column="4">壬</data>
<data row="2" column="5">癸</data>
</databank>

 

4 将表格转换为CSV文件

虽然XSLT一般用来将XML文档转换成XML文档,但是也能够输出XML文档之外的格式。下面是将含有table元素的HTML文档转换成CSV(Comma Separated Value)格式输出的例子(程序5)。 1

程序5: csv.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:apply-templates select=".//tr"/>
</xsl:template>
<xsl:template match="tr">
<xsl:for-each select="td">
<xsl:value-of select="."/>
<xsl:if test="not(position()=last())">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
为输出文本格式,需要指定
<xsl:output method="text" encoding="UTF-8"/>
由于被转换的对象节点是表示行的tr元素,因此针对tr元素定义模板规则。若不是行中的最后一个元素,则输出分隔符“,”。
<xsl:if test="not(position()=last())">
<xsl:text>,</xsl:text>
</xsl:if>
将程序3进行转换的结果如下所示。
甲,乙,丙,丁,戊
己,庚,辛,壬,癸

 

 

这篇关于XSLT入门 -- 第3章 实践篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/941700

相关文章

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro