- 浏览: 2879305 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (1173)
- 名言警句 (5)
- 心情随笔 (50)
- 数据库 (57)
- Java基础 (241)
- J2EE框架 (91)
- 数据结构 (12)
- 程序设计 (21)
- WEB技术 (128)
- 网络日志 (12)
- IT资讯 (247)
- linux (64)
- solaris (2)
- 其它 (143)
- WebService (4)
- 日语学习 (2)
- 机器人 (5)
- Android (5)
- cgywin (3)
- Game (1)
- DWR (1)
- spring (8)
- canvas (1)
- Guava (3)
- Modbus (5)
- 测试 (6)
- mongodb (9)
- Quartz (2)
- Cron (1)
- windows (2)
- 持续集成 (1)
- bootstrap (3)
- 结对编程 (1)
- nodejs (1)
- Netty (1)
- 安全 (3)
- webstorm (2)
- sparkline (1)
- Job (1)
- git (3)
- Maven (3)
- knockout (5)
- jquery (1)
- bower (1)
- docker (1)
- confluence (4)
- wiki (1)
- GoogleMap (1)
- jekyll (10)
- ruby (2)
- npm (3)
- browserify (1)
- gulp (3)
- openwrt (1)
- discuz (3)
- 输入法 (1)
- JPA (1)
- eclipse (2)
- IntelliJ (1)
- css (1)
- 虚拟机 (1)
- 操作系统 (1)
- azkaban (2)
- scrum (1)
最新评论
-
pangxiea_:
你好, 想请问一下 Linux下 这么使用rxtxcomm 在 ...
使用Java进行串口通信 -
abababudei:
请教一下,这个您是怎么解决的:/dev/ttyS2enteri ...
Java应用程序的MODBUS通讯 -
xuniverse:
hannibal005 写道楼主,我问下 request.se ...
用javascript与java进行RSA加密与解密 -
atxkm:
找了一下午,终于找到了
gulp 拷贝文件时如何移除文件目录结构 -
kalogen:
gtczr 写道非常感谢,经过我自己的修改,已经完美实现。发出 ...
用javascript与java进行RSA加密与解密
最近一直在研究BASE64编解码,偶然想到用XSLT来实现,在网络上搜索了半天,没有找到一篇相关的文章和说明。偶在O'REILLY的网站上看到有人求解,只见答复XSLT1.0无解,XSLT2.0才有相关方法函数,然而XSLT2.0的应用还不是很普遍。 熟悉XSLT&XPath的你一定知道,两者都没有相关方法函数可以取字符的ASCII值。而这一功能正是BASE64编解码的基本要素之一。 因为取不到ASCII值,用XSLT来实现BASE64编解码的想法几乎要放弃了。难道就这么放弃?这不是我的风格,我喜欢迎难而进! 受BASE64解码思想和之前自己用XSLT&XPath写的循环输出A-Z字符代码的启发,借助XPath中的几个字符串处理函数,终于实现了XSLT1.0环境下BASE64的编解码。 BASE64编码的原理就不再重复了,这里只附上wikipedia的BASE64编码的原理,同时介绍如何通过XSLT&XPath实现字符到“ASCII值”的转换原理: 基本的ASCII字符对应的ASCII为0-127,其中0-31、127共33个字符为控制字符,不可显示,32-126为可显示字符。据此,我们可以建立一个映射表,即“ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~,”(注意:控制字符因为无法显示, 这里暂不考虑),其在映射表中的次序加上31即得到“ASCII值”。 附wikipedia的BASE64编码的原理: 转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲区中剩下的Bit用0补足。然后,每次取出6个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。 BASE64的解码实为编码的逆过程。 XSLT1.0实现BASE64编解码:
如果最后剩下两个输入数据,在编码结果后加1个「=」;如果最后剩下一个输入数据,编码结果后加2个「=」;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。<?xml version="1.0" encoding="gb2312" ?>
<!--Encoding&Decoding base64 with XSLT1.0-->
<!--BASE64编解码之XSLT1.0实现-->
<!--Author:Qr http://Qr.blogger.org.cn-->
<!--Date:2009/06/29-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="gb2312" indent="yes"/>
<xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"/>
<xsl:output doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
<xsl:variable name="CODEPAD" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'"/>
<xsl:variable name="ASCII"><![CDATA[ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~,]]></xsl:variable>
<!--原始字符串-->
<xsl:variable name="CHAR" select="'Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.'"/>
<!--原始字符串长度-->
<xsl:param name="STRLENGTH" select="string-length($CHAR)"/>
<!--循环次数-->
<xsl:param name="CYCLE_CNT" select="floor($STRLENGTH div 3)"/>
<!--模值-->
<xsl:param name="MOD" select="$STRLENGTH mod 3"/>
<!--待解码字符串-->
<xsl:variable name="STR" select="'TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4='"/>
<!--待解码字符串长度-->
<xsl:param name="STRLEN" select="string-length($STR)"/>
<!--循环次数-->
<xsl:param name="CYCLECNT" select="floor($STRLEN div 4)"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="gb2312" lang="gb2312">
<head>
<title>BASE64编解码之XSLT1.0实现 - Encoding&Decoding base64 with XSLT1.0 by Qr</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
</head>
<body>
<div style="margin:50px 168px;">
<h1 style="text-align:center;">BASE64编解码之XSLT1.0实现</h1>
<xsl:text>原始字符串:[Thomas Hobbes's Leviathan文句]</xsl:text>
<textarea rows="6" cols="80" style="width:100%">
<xsl:value-of select="$CHAR"/>
</textarea>
<xsl:text>编码字符串:</xsl:text>
<textarea rows="6" cols="80" style="width:100%">
<xsl:call-template name="base64_encode">
<xsl:with-param name="number" select="1"/>
</xsl:call-template>
<xsl:if test="$MOD != 0">
<xsl:value-of select="substring($CODEPAD,floor((string-length(substring-before($ASCII,substring($CHAR,$CYCLE_CNT*3+1,1)))+1+31) div 4)+1,1)"/>
<xsl:variable name="sec">
<xsl:choose>
<xsl:when test="1=$MOD">0</xsl:when>
<xsl:otherwise><xsl:value-of select="floor((string-length(substring-before($ASCII,substring($CHAR,$CYCLE_CNT*3+2,1)))+31) div 16)"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="substring($CODEPAD,((string-length(substring-before($ASCII,substring($CHAR,$CYCLE_CNT*3+1,1)))+1+31) mod 4)*16+$sec+1,1)"/>
<xsl:choose>
<xsl:when test="1=$MOD"><xsl:value-of select="'='"/></xsl:when>
<xsl:otherwise><xsl:value-of select="substring($CODEPAD,((string-length(substring-before($ASCII,substring($CHAR,$CYCLE_CNT*3+2,1)))+1+31) mod 16)*4+1,1)"/></xsl:otherwise>
</xsl:choose>
<xsl:value-of select="'='"/>
</xsl:if>
</textarea>
<xsl:text>解码字符串:</xsl:text>
<textarea rows="6" cols="80" style="width:100%">
<xsl:call-template name="base64_decode">
<xsl:with-param name="number" select="1"/>
</xsl:call-template>
<xsl:value-of select="substring($ASCII,(((string-length(substring-before($CODEPAD,substring($STR,$CYCLECNT * 4 - 3,1)))+1) mod 256 - 1)*4) + floor(((string-length(substring-before($CODEPAD,substring($STR,$CYCLECNT * 4 - 2,1)))) mod 256) div 16)-31,1)"/>
<xsl:choose>
<!--第三、四个字符为“=”-->
<xsl:when test="substring($STR,$CYCLECNT * 4 - 1,1)='='"></xsl:when>
<xsl:otherwise>
<!--第三个字符不为“=”-->
<xsl:value-of select="substring($ASCII,(((string-length(substring-before($CODEPAD,substring($STR,$CYCLECNT * 4 - 2,1)))) mod 16)*16 - 0) + floor(((string-length(substring-before($CODEPAD,substring($STR,$CYCLECNT * 4 - 1,1)))+1) mod 256) div 4) -31,1)"/>
<xsl:choose>
<!--全无“=”-->
<xsl:when test="substring($STR,$CYCLECNT * 4,1)!='='">
<xsl:value-of select="substring($ASCII,(((string-length(substring-before($CODEPAD,substring($STR,$CYCLECNT * 4 - 1,1)))) mod 4)*64 - 1) + floor(((string-length(substring-before($CODEPAD,substring($STR,$CYCLECNT * 4,1)))+1) mod 255)) - 31,1)"/>
</xsl:when>
<!--末字符“=”-->
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</textarea>
</div>
</body>
</html>
</xsl:template>
<!--Encoding&Decoding base64 with XSLT1.0-->
<!--Author:Qr http://Qr.blogger.org.cn-->
<xsl:template name="base64_encode">
<xsl:param name="number"/>
<xsl:if test="not($number > ($STRLENGTH - $MOD))">
<!--3转4字节第1字符-->
<xsl:value-of select="substring($CODEPAD,floor((string-length(substring-before($ASCII,substring($CHAR,$number,1)))+1+31) div 4)+1,1)"/>
<!--3转4字节第2字符-->
<xsl:value-of select="substring($CODEPAD,((string-length(substring-before($ASCII,substring($CHAR,$number,1)))+1+31) mod 4)*16+floor((string-length(substring-before($ASCII,substring($CHAR,$number+1,1)))+1+31) div 16)+1,1)"/>
<!--3转4字节第3字符-->
<xsl:value-of select="substring($CODEPAD,((string-length(substring-before($ASCII,substring($CHAR,$number+1,1)))+1+31) mod 16)*4 + floor((string-length(substring-before($ASCII,substring($CHAR,$number+2,1)))+31) div 64)+1,1)"/>
<!--3转4字节第4字符-->
<xsl:value-of select="substring($CODEPAD,((string-length(substring-before($ASCII,substring($CHAR,$number+2,1)))+1+31) mod 64)+1,1)"/>
<!--根据base64的编码规则,每76个字符需要一个换行。根据实际需要取舍-->
<!--Firefox未通过。-->
<!--number始于1,故只须+2,而不必+3-->
<xsl:if test="0=(($number+2) mod 19)">
</xsl:if>
<xsl:call-template name="base64_encode">
<xsl:with-param name="number" select="$number + 3"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!--Encoding&Decoding base64 with XSLT1.0-->
<!--Author:Qr http://Qr.blogger.org.cn-->
<xsl:template name="base64_decode">
<xsl:param name="number"/>
<xsl:if test="$number < ($STRLEN - 4)">
<!--4转3字节第1字符-->
<xsl:value-of select="substring($ASCII,(((string-length(substring-before($CODEPAD,substring($STR,$number,1)))+1) mod 256 - 1)*4) + floor(((string-length(substring-before($CODEPAD,substring($STR,$number+1,1)))) mod 256) div 16)-31,1)"/>
<!--4转3字节第2字符-->
<xsl:value-of select="substring($ASCII,(((string-length(substring-before($CODEPAD,substring($STR,$number+1,1)))) mod 16)*16 - 0) + floor(((string-length(substring-before($CODEPAD,substring($STR,$number+2,1)))+1) mod 256) div 4)-31,1)"/>
<!--4转3字节第3字符-->
<xsl:value-of select="substring($ASCII,(((string-length(substring-before($CODEPAD,substring($STR,$number+2,1)))) mod 4)*64 - 1) + floor(((string-length(substring-before($CODEPAD,substring($STR,$number+3,1)))+1) mod 255))-31,1)"/>
<xsl:call-template name="base64_decode">
<xsl:with-param name="number" select="$number + 4"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!--Encoding&Decoding base64 with XSLT1.0-->
<!--Author:Qr http://Qr.blogger.org.cn-->
</xsl:stylesheet>
编解码例句这里还是采用Thomas Hobbes's Leviathan文句:
Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.
编码结果:
TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=
以上结果按base64的编码规则76字符换行,解除码时,须将换行相关字符去除再转换,但以上代码没有把这个问题考虑进去,只是将除去换行相关字符的待解码串直接赋值给变量STR。
解码结果:
Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.
由于映射表中无法将ASCII的控制字符(不可显示字符)加入,因此,待编码字符串只能包含ASCII值小于32和等于127的字符(故TAB和换行等均无法正确编解码),否则,编解码将无法顺利进行,同时也得不到正确的结果。大家如果有兴趣,可以来完善这个功能。
熟悉XSLT&XPath的你一定知道,字符处理并不是XSLT的强项,这项工作本也不该XSLT来做。本文之所以用XSLT来,纯粹学术讨论。
最后,说明一下,编解码过程中,如果把编解码后的字符串组联合起来作为变量再次递归恐怕会影响编解码的速度,所以本例将每组(3转4或4转3)编解码结果直接输出到textarea中,而没有将结果作为变量再次传入命名模板中递归。
发表评论
-
30个你必须熟记的CSS选择器
2015-06-27 08:44 1777你学会了基本的id,class类选择器和descendant ... -
40 个超棒的免费 Bootstrap HTML5 网站模板
2015-04-11 16:12 2860Bootstrap 是快速开发Web应用程序的前端工具包。它 ... -
必须记住的 30 类 CSS 选择器
2014-12-30 08:56 1009大概大家读知道`id`,`class`以及`descenda ... -
如何防止google map 加载Roboto字体
2014-12-26 13:16 879思路是在window.onload中当检测到加载Roboto ... -
JavaScript Equality Table
2014-12-09 16:17 1886Tables displaying the issue: ... -
WebStorm快捷键收集
2014-11-25 10:40 30141、webstorm快捷键: IntelliJ-Idea ... -
webstorm 常用快捷键
2014-08-25 15:58 951常用快捷键 Ctrl+/ 或 Ctrl+Shift+/ ... -
how to change bower components folder
2014-08-25 09:26 7821. create the file bower.json ... -
程序员应该知道的 13 个设计技巧
2014-07-14 09:34 748开发你的美感 … 我最喜欢的站点是: a ... -
tomcat7中tomcat-users.xml配置
2014-04-26 15:48 716将以下代码加入tomcat-users.xml中,即可登录t ... -
tomcat-maven-plugin的使用
2014-03-04 10:52 889环境: Ubuntu 8.10, tomcat6, ma ... -
Jsp动态显示服务器时间
2013-12-31 13:16 1089<script language=" ... -
前端工程与性能优化(下):静态资源管理与模板框架
2013-09-25 08:57 995本系列文章从一个全新的视角来思考web性能优化与前端工程之间 ... -
前端工程与性能优化(上):静态资源版本更新与缓存
2013-09-20 09:35 980每个参与过开发企业级 ... -
Handy and Useful jQuery Snippets for Developers
2013-09-18 15:43 813jQuery is a cross browser Java ... -
11 个用来创建图形和图表的 JavaScript 工具包
2013-08-13 07:00 1362Aristochart DEMO || Download ... -
Jive 论坛 license破解
2013-08-03 13:27 13351. 找到文件 \admin\global.jspf 注释 ... -
2012年度最佳Web前端开发工具和框架
2013-01-10 10:52 17692012年,Web 开发领域继续在快速的发展,HTML5 ... -
为网页设计师准备的 10 个色彩方案生成器
2012-02-22 23:01 1199Pictaculous ColorExplo ... -
13个最常用的CSS和HTML快速开发工具
2012-02-21 08:18 12831)CleverCSS CleverCSS ...
相关推荐
### XSLT1.0与XPath1.0快速参考指南 #### XSLT与XPath简介 XSLT(Extensible Stylesheet Language Transformations)是一种用于转换XML文档的语言,而XPath则是一种在XML文档中查找信息的语言。XSLT 1.0与XPath 1.0...
**XSLT 1.0 快速指南** XSLT(Extensible Stylesheet Language Transformations)1.0是一种强大的语言,用于将XML(Extensible Markup Language)文档转换为其他XML文档、HTML、文本或者任何支持XPath数据模型的...
《XSLT1.0实现XML到JSON转换的深度解析》 XML(eXtensible Markup Language)和JSON(JavaScript Object Notation)是两种广泛用于数据交换的格式,各有其优势。XML以其丰富的结构和语义特性在企业级应用中占据...
### XSLT 调用 Java 的类方法详解 #### 一、背景介绍 XSLT(Extensible Stylesheet Language Transformations)是一种...通过以上步骤,我们可以实现在XSLT中调用Java类方法的功能,从而极大地扩展了XSLT的处理能力。
1. XSLT 1.0:不支持 `replace()` 函数,但可以使用模板匹配和`<xsl:value-of>`结合`<xsl:choose>`, `<xsl:when>` 和 `<xsl:otherwise>` 来实现类似的功能,但不够灵活且代码较复杂。 2. XSLT 2.0及以上:引入了 `...
Learning XSLT moves smoothly from the simple to complex, illustrating all aspects of XSLT 1.0 through step-by-step examples that you'll practice as you work through the book. Thorough in its coverage ...
在"SVG和XSLT实现统计图表源代码"这个项目中,开发者可能利用了SVG的矢量图形能力来创建各种类型的统计图表,如条形图、饼图、折线图等。SVG的优点在于它的图形质量不会因放大而损失,这使得它非常适合用于生成高...
XSLT 开发人员指南,书比较老,是针对XSLT 1.0的,学习学习吧。有问题可交流
XSLT有多个版本,最常用的是XSLT 1.0和XSLT 2.0。XSLT 2.0引入了许多新功能,如函数库、类型系统和更复杂的遍历机制,增强了其在代码生成中的应用能力。 2.3 **EXSLT** EXSLT是扩展XSLT的一个开源项目,提供了许多...
本文将详细介绍如何通过XSLT实现字符串的替换,并重点探讨两种常用的方法:使用`ms:script`(仅限于Microsoft的XML解析器)以及纯XSL模板。 ### XSL中的字符串替换 #### 使用translate函数 对于简单的字符替换...
在企业级系统中,XSLT可用于整合来自不同来源的数据,实现数据的标准化和统一化。 #### 六、结论 XSLT作为一种成熟且功能强大的XML转换语言,对于任何需要处理大量XML数据的开发者来说都是非常有价值的工具。它...
Chapter 4.XPath 1.0(and 2.0) and XSLT 1.0(and 2.0) Chapter 5.XPath 1.0and 2.0) and XSLT 1.0(and 2.0),Continued Chapter 6.Namespaces in XML 1.1(Second Edition) SVG 1.1,and XSL(XSL-FO) 1.1 Chapter 7....
- Xalan是Apache软件基金会的一个项目,提供了一个实现XSLT 1.0和2.0规范的处理器。Xalan支持创建自定义函数,这些函数可以在XSLT样式表中被调用,实际上它们是用Java编写的。使用`<xsl:extension-element-prefix>`...
6. XSLT 1.0与XSLT 2.0/3.0的区别:XSLT 2.0引入了许多新功能,如正则表达式支持、函数库扩展、更多数据类型和更强大的样式表组合能力。XSLT 3.0进一步增强了这些特性,如支持静态类型检查、流式处理API和异步处理。...
### XSLT简单教程——XSLT的实例详解 #### 一、XSLT简介与工作...XSLT的强大之处在于它不仅限于简单的文本转换,还可以根据复杂的逻辑和条件来进行数据筛选、排序等多种操作,极大地提升了XML数据的处理能力和灵活性。
总结来说,XSLT作为XML数据转换的语言,其强大之处在于它能够对XML文档进行深度处理,不仅仅是简单的样式调整,而是真正实现了数据的结构性转换。随着XML在互联网和企业信息系统中的广泛应用,XSLT成为了处理XML数据...
于是就研究使用Struts2的XSLT result方式来做页面显示。 网上相关的内容非常的少,我也研究了好久才玩转的。一开始总是有一些莫名其妙的问题出现,但最后基本上都是和配置相关的比较多。现在这个例子是整个工程项目...
**JSTL(JavaServer Pages Standard Tag Library)与Standard库1.0版本详解** JSTL,全称为JavaServer Pages Standard Tag Library,是JavaWeb开发中的一个标准标签库,它提供了一系列预定义的标签,用于简化JSP...
所有样式表只需要 XSLT 1.0。一些样式表需要一些 EXSL 函数。它们的名称以 . 为后缀Exsl。 可用转换列表 音乐转变 乐谱部分选择: removeLastPart:删除最后一个分数部分。 removeAllButLastPart:删除除最后一个...