實(shí)現(xiàn)XML的加密和改寫

XML數(shù)據(jù)一個(gè)最普通的問題就是數(shù)據(jù)的大小寫,在進(jìn)行數(shù)據(jù)轉(zhuǎn)換時(shí)常常產(chǎn)生令人頭疼的麻煩。下面就是一個(gè)解決的辦法。

假設(shè)你有一些數(shù)據(jù)要發(fā)送到另外一個(gè)系統(tǒng),它也識(shí)別XML格式的數(shù)據(jù),而且要求全部大寫,例子數(shù)據(jù)如下:

例子1:person.xml

<Person>
<Name>
<First>net_lover</First>
<Last>Xianhui Meng</Last>
<ChineseName>孟憲會(huì)</ChineseName>
</Name>
</Person>

假設(shè)你要轉(zhuǎn)換成如下的格式:

例子2:newperson.xml

<PERSON>
<NAME>
<FIRST>NET_LOVER</FIRST>
<LAST>XIANHUI MENG</LAST>
<CHINESENAME>孟憲會(huì)</CHINESENAME>
</NAME>
</PERSON>

解決這個(gè)轉(zhuǎn)換問題一般是用XPATH函數(shù)里的translate(),例如:

<foo><xsl:value-of select="translate('This is a test', 'tis', 'TIS')" /></foo>
轉(zhuǎn)換后結(jié)果如下:
<foo>ThIS IS a TeST</foo>?
但是如何把全部的文字轉(zhuǎn)換成大寫呢?下面就是進(jìn)行這樣處理的代碼:

先定義兩個(gè)變量:

<xsl:variable name="uppercase">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
<xsl:variable name="lowercase">abcdefghijklmnopqrstuvwxyz</xsl:variable>

再進(jìn)行轉(zhuǎn)換:

<foo><xsl:value-of select="translate('This is a test', $lowercase, $uppercase)" /></foo>

結(jié)果如下:

<foo>THIS IS A TEST</foo>

對(duì)剛才的問題,可以編寫XSL文件如下:

例子3: person.xsl

<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:variable name="uppercase">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
<xsl:variable name="lowercase">abcdefghijklmnopqrstuvwxyz</xsl:variable>
<xsl:template match="/">
<PERSON>
<NAME>
<FIRST><xsl:value-of select="translate(/Person/Name/First,$lowercase,$uppercase)"/></FIRST>
<LAST><xsl:value-of select="translate(/Person/Name/Last,$lowercase,$uppercase)"/></LAST>
</NAME>
</PERSON>
</xsl:template>
</xsl:stylesheet>

啟發(fā)

從上面的方法會(huì)想到什么呢?對(duì)數(shù)據(jù)進(jìn)行加密!對(duì)了,用這種方法可以實(shí)現(xiàn)XML數(shù)據(jù)的加密。

例子:
<xsl:variable name="alphanumeric">ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
</xsl:variable>
<xsl:variable name="encoded">
K1aWXJBb2cRdeAMfQgL8yhij976klEFzmYSnIo4DpTZq5rNsUtC0uOPvVwGxH3
</xsl:variable>?

<foo><xsl:value-of select="translate('This is a test', $alphanumeric, $encoded)" /></foo>

加密后結(jié)果如下:

<foo>8Snr6nr6k6NzrN</foo>

解密也很簡(jiǎn)單,只要把兩個(gè)變量顛倒即可。