Notification Service中的XML內含HTML,怎麼拆解?

摘要: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中它其實是把他當成一般的文字,所以沒有特別定義的註解,那解釋出來的內容,只
會剩下:
&lt;IMG SRC="http://jr9bgq.bay.livefilestore.com/y1pCZwzvgnGxzVCLVP2LhHhRW7eqht-GjvR6ntgkrLviJFhJuyWPPtfAPtdNqq7BTv9Wdd3wpsVpl22VWOnIBd0dA/!asterisk.gif" WIDTH="55" HEIGHT="30" /&gt;
所以,透過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: