XML數據一個最普通的問題就是數據的大小寫,在進行數據轉換時常常產生令人頭疼的麻煩。下面就是一個 解決的辦法。
假設你有一些數據要發送到另外一個系統,它也識別XML格式的數據,而且要求全部大寫,例子數據如下:
例子1:person.XML
<Person>
<Name>
<First>net_lover</First>
<Last>Xianhui Meng</Last>
<ChineseName>孟憲會</ChineseName>
</Name>
</Person>
假設你要轉換成如下的格式:
例子2:newperson.XML
<PERSON>
<NAME>
<FIRST>NET_LOVER</FIRST>
<LAST>XIANHUI MENG</LAST>
<CHINESENAME>孟憲會</CHINESENAME>
</NAME>
</PERSON>
解決這個轉換問題一般是用XPATH函數裡的translate(),例如:
<foo><xsl:value-of select="translate('This is a test', 'tis', 'TIS')" /></foo>
轉換後結果如下:
<foo>ThIS IS a TeST</foo>
但是如何把全部的文字轉換成大寫呢?下面就是進行這樣處理的代碼:
先定義兩個變量:
<xsl:variable name="uppercase">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
<xsl:variable name="lowercase">abcdefghijklmnopqrstuvwxyz</xsl:variable>
再進行轉換:
<foo><xsl:value-of select="translate('This is a test', $lowercase, $uppercase)" /></foo>
結果如下:
<foo>THIS IS A TEST</foo>
對剛才的問題,可以編寫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>
啟發
從上面的方法呢會想到什麼呢?對數據進行加密!對了,用這種方法可以實現XML數據的加密。
例子:
<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>
加密後結果如下:
<foo>8Snr6nr6k6NzrN</foo>
解密也很簡單,只要把兩個變量顛倒即可。
<?XML version="1.0" encoding="gb2312"?>
<xsl:stylesheet XMLns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:variable
name="alphanumeric">ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789</xsl:variable>
<xsl:variable
name="encoded">K1aWXJBb2cRdeAMfQgL8yhij976klEFzmYSnIo4DpTZq5rNsUtC0uOPvVwGxH3</xsl:variable>
<xsl:template match="/">
<foo><xsl:value-of select="translate('This is a test', $alphanumeric, $encoded)" /></foo>
|||
<foo><xsl:value-of select="translate('8YS5 S5 6 rF5r', $encoded,$alphanumeric )" /></foo>
</xsl:template>
</xsl:stylesheet>