摘要:Notification Service中的XML內含HTML,怎麼拆解?
昨晚半夜睡到一半,腦中想到好像有什麼事情沒有做完,馬上跳起來按了一下OUTLOOK,果然沒有錯。MS SQL Server 2005中的一個部分,我還沒有
完全的測試完成。這次要測試的內容是,「如果XML內含HTML,該怎麼拆解?」。這個問題,我想應該也很多人會遇到,因為過去我在開發通報程
式的時候,也有遇到相當類似的問題。讓我徹底覺得XML真的是一個相當具有彈性與交換性的一種標準語言,難怪Semantic Web要用XML來描述每一
個東西,因為這樣的確可以詳細描述讓人也讓電腦可以懂。有點扯遠了,下面將分成二個部分來分別說明:(A) 透過XSLT拆解XML中的HTML內容;
(B) 設定 MS SQL Server 2005中Notification Services的設定,幫助支援特殊字元儲存。
(A) 透過XSLT拆解XML中的HTML內容
假設今天有一個XML內容如下:
<notification> <UserID>1234</UserID> <Name>Pou</Name> <Mail>pou629@hotmail.tw</Mail> <ImageList> <Image> <img src="http://jr9bgq.bay.livefilestore.com/y1pCZwzvgnGxzVCLVP2LhHhRW7eqht-GjvR6ntgkrLviJFhJuyWPPtfAPtdNqq7BTv9Wdd3wpsVpl22VWOnIBd0dA/!asterisk.gif" WIDTH="55" HEIGHT="30" /><img src=""WIDTH="55" HEIGHT="30" /><img src="http://jr9bgq.bay.livefilestore.com/y1pCZwzvgnGxzVCLVP2LhHhRW7eqht-GjvR6ntgkrLviJFhJuyWPPtfAPtdNqq7BTv9Wdd3wpsVpl22VWOnIBd0dA/!asterisk.gif" WIDTH="55" HEIGHT="30" /> </Image> <ImageList> </notification> |
可看到XML內容,包括了<img>這個HTML的圖片Tag,而在XML中它其實是把他當成一般的文字,所以沒有特別定義的註解,那解釋出來的內容,只
會剩下:
<IMG SRC="http://jr9bgq.bay.livefilestore.com/y1pCZwzvgnGxzVCLVP2LhHhRW7eqht-GjvR6ntgkrLviJFhJuyWPPtfAPtdNqq7BTv9Wdd3wpsVpl22VWOnIBd0dA/!asterisk.gif" WIDTH="55" HEIGHT="30" /> |
所以,透過XSLT要怎麼來做定義,標準的拆解掉內容中的HTML呢。如下之XSLT內容:
<?xml version="1.0" encoding="utf-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="*"></xsl:template> <xsl:template match="/"> <html> <xsl:apply-templates select="//notification"/> </html> </xsl:template> <!-- --> <xsl:template match="notification"> <br/> 帳號:<xsl:value-of select="UserID"/><br/> 姓名:<xsl:value-of select="Name"/><br/> EMail:<xsl:value-of select="Mail" /><br/> 條碼:<xsl:apply-templates select="//ImageList"/> </xsl:template> <xsl:output method="html"/> //此段,是定義整篇XML翻譯完的結果為:HTML。 <xsl:template match="ImageList"> <TR> <td align="center" colspan="4"> <div> <xsl:value-of select="Image" disable-output-escaping="yes" /> //此段,是定義將XML內容值,直接翻釋,不做任何XML的編譯。 </div> </td> </TR> </xsl:template> </xsl:stylesheet> |
在透過 disable-output-escaping="yes"此段時,必須注意它的預設值為 "no"。如果值為 "yes",則會輸出藉由具現化 <xsl:value-of> 項目所產生的
文字節點,而不會包含任何逸出。例如,下列程式碼將會產生單一字元 "<"。簡單來講就是,如果XML內容中有<>&…等特殊定元,甚至是HTML的
Tag你都可以透過這個設定為YES,把它的值直接翻譯相當方便的方式,但在使用您必須特別注意,因為它解譯出來的,並非正規的XML格式,因此可能會造成您的XML與HTML之間無法對應與轉換。要特別注意。
(B) 設定 MS SQL Server 2005中Notification Services的設定,幫助支援特殊字元儲存
如果你在儲存XML之資料庫的時候,你發現你的XML內容中可能會有些上述的一些特殊字元,不想要被翻譯出來,所以你可以透過<!CDATA[[的方式
來將內容包括起來,就可以儲存在XML欄位之中。但是,這樣是不是很麻煩。每一個內容欄位還要補上<!CDATA[[這些字,想到就覺得處理又是一個
困難的方式,因此在使用Notification Services時,你可以透過Application Definition File (ADF),對於XSLT的設定,來進行加入下方的XML內容。這樣就
可以讓XML欄位中,如果存在特殊字元,也能放心存在XML欄位中,因為最後翻譯的事就交由ADF定義來解決吧。
<Arguments> <Argument> <Name>XsltBaseDirectory</Name> <Value>C:\TransformDirectory</Value> </Argument> <Argument> <Name>XsltFileName</Name> <Value>StockTransform.xsl</Value> </Argument> <Argument> <Name>DisableEscaping</Name> <Value>true</Value> </Argument> </Arguments> |
Reference: