2015年9月7日

漢堡選單(Hamburger Menu)

簡易的漢堡選單,範例如附件


2009年6月4日

SQL Server 加密函數

PWDENCRYPT與PWDCOMPARE函數

而 PWDENCRYPT 與 PWDCOMPARE 函數,一個負責加密、一個負責比對,但就是沒有「解密」的函數。意思也就是說,使用 PWDENCRYPT 加密過的資料是無法反解的,類似一種 Hash 處理方法。

PWDENCRYPT 函數
select pwdencrypt('xxxxx')


注意:每次執行 pwdencrypt('xxxxx') 的結果都會不一樣,這是一種對密碼保護的機制。

PWDCOMPARE 函數
select pwdcompare('xxxxx', 加密後字串)

執行後的結果為 1 或 0 而已,1 代表密碼比對成功,0 代表密碼比對失敗。

這兩個 Function 在 SQL 2000, 2005, 2008 都可以使用,只是我也發現了一些不同的 SQL Server 版本之間在使用這兩個 Function 時的小差異:
1.使用 PWDENCRYPT 時 SQL 2000 與 SQL 2005/2008 加密過後的 hash 長度不一樣!
2.SQL 2005/2008 加密過的密碼在 SQL 2000 中無法使用 PWDCOMPARE 函數驗證密碼!
3.SQL 2005 與 SQL 2008 基本上是相容的。
4.SQL 2000 加密過的密碼雖然比較長,但在 SQL 2005/2008 中還是可以使用 PWDCOMPARE 函數驗證密碼!

2009年5月13日

XML CDATA區段


XML 對於許多人都不陌生,但還是有些地方大家不知道該如何使用,例如現在所要介紹的 CDATA 區段。

在某些時候內容中含有 HTML 標籤或者是一些特殊字元﹙如﹕<、>、&﹚,當這些字元出現在內容裡,通常都會出現 XML 分析錯誤的情況,這時候就必須將這些字元作些轉換的工作(如︰< / <、> / >、& / &)。

其實並不需要如此,CDATA 區段提供了一種通知剖析器的方法,說明 CDATA 區段所包含的字元沒有標記。

當 XML 剖析器遇到開頭的<![CDATA[,會將接下來的內容報告成字元,而不會嘗試將其解譯成項目或實體標籤。字元參考不能在 CDATA 區段內運作。當它遇到結尾的]]>時,剖析器會停止報告並回到正常的剖析,這也能使用在 HTML 文件中。使用方法為︰

<![CDATA[這裡面內容包含了 <font size="3">HTML 標籤</font>,
以前一些特殊字元 & 所以要使用 CDATA 區段包起來]]>

2009年5月12日

ASP 連結 SQL Server 2005 錯誤 '80004005'

使用 ASP 連結 SQL Server 2005 Developer Edition 時遇到一個奇怪的錯誤:

Microsoft OLE DB Provider for SQL Server 錯誤 '80004005'
[DBNETLIB][ConnectionOpen (PreLoginHandshake()).]一般網路錯誤。 查閱您的網路文件。

結果在 http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1382037&SiteID=1 查到解答

原來是要開啟『SQL Server 介面區組態』,把『服務和連接的介面區組態』裡面『Database Engine』的『遠端連接』從『僅本機連接』改成『本機和遠端連接』必須包含TCP/IP

2009年5月5日

asp動態加入xsl:include

asp動態加入xsl:include

範例如下
testXML.asp
<%
set htPageDom = Server.CreateObject("MICROSOFT.XMLDOM")
htPageDom.async = false
htPageDom.setProperty("ServerHTTPRequest") = true

'讀取XML File
LoadXML = server.MapPath("/hyweb") & "/testXML.xml"
xv = htPageDom.load(LoadXML)

'讀取XSLT File
set oxsl = Server.CreateObject("MICROSOFT.XMLDOM")
oxsl.load(server.MapPath("/hyweb") & "/testXML.xsl")

'產生xsl:include節點
set incXML = Server.CreateObject("MICROSOFT.XMLDOM")
set incSlt = incXML.createNode(1, "xsl:include","http://www.w3.org/1999/XSL/Transform")

'加入href屬性
Set NewAttribute=incXML.createAttribute("href")
NewAttribute.Text= "unitSLT.xsl"
incSlt.SetAttributeNode NewAttribute

'插入新節點於第一個子節點之前
set oxRoot = oxsl.selectSingleNode("xsl:stylesheet")
oxRoot.insertBefore incSlt,oxRoot.firstChild

'輸出至畫面
Response.ContentType = "text/HTML"
outString = replace(htPageDom.transformNode(oxsl),"<META http-equiv=""Content-Type"" content=""text/html; charset=UTF-16"">","")
outString = replace(outString,"&","&")
response.write replace(outString,"&","&")
%>


testXML.xml
<?xml version="1.0"?>
<A name="0">
<B name="1">
<C>B1C</C>
<C>B1C2</C>
</B>
<B name="2">
<C>B2C1</C>
<C>B2C2</C>
<D>B2D1</D>
</B>
</A>


testXML.xsl
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/">
Use Tempale testXML.xsl<br/>
<xsl:apply-templates select="A/B[1]/parent::*"/>
</xsl:template>

unitSLT.xsl
</xsl:stylesheet>


<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="*|@*"/>
<xsl:if test="text()">
<xsl:value-of select="."/>
</xsl:if>
</xsl:element>
</xsl:template>

<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>

<xsl:template match="/">
Use Tempale nuitSLT.xsl<br/>
<xsl:apply-templates select="A/B[1]"/>
</xsl:template>

</xsl:stylesheet>


輸出結果
Use Tempale testXML.xsl
<A name="0">
<B name="1">
<C>B1C</C>
<C>B1C2</C>
</B>
<B name="2">
<C>B2C1</C>
<C>B2C2</C>
<D>B2D1</D>
</B>
</A>

這裡要注意的是在testXML.xsl及unitSLT.xsl上都有<xsl:template match="/">的標籤,這樣的情況後面的tag會覆寫前面同名的tag

2009年5月3日

XPath 比較運算

若要比較 XPath 中的兩個物件,請使用 = 符號來測試是否相等,或使用 != 測試是否不相等。
若是比較運算,必須只能提供兩個運算元。接下來評估每個運算元以進行比較,再視需要予以轉換,讓它們擁有相同的型別。這個動作會根據底下說明的處理程序<比較優先順序>執行。
所有項目和屬性都是字串,但對於數字比較,則會自動轉換成整數值。在比較運算期間,常值數值會轉換成 long 或 double 型別,如下列表格所示。
如需 < 及其他二進位比較運算子的詳細資訊,請參閱底下的「二進位比較運算子」。

常值型別 比較 範例
String  text(lvalue) op text(rvalue)   a &lt; GGG 
Integer  (long) lvalue op (long) rvalue   a &lt; 3 
Real  (double) lvalue op (double) rvalue   a &lt; 3.1 

可在運算式中將單引號或雙引號當做字串分隔符號 (Delimiter)。這能更容易從指令碼語言中建構和傳遞模式。
範例
運算式 表示
 author[last-name = "Bob"]  內含至少一個  <last-name>  項目 (含值  Bob ) 的所有  <author>  項目。
 author[last-name[1] = "Bob"]  擁有值  Bob  的第一個  <last-name>  子項目所屬的所有  <author>  項目。
 author/degree[@from != "Harvard"]  包含  <degree>  項目 (含有不等於  "Harvard"  的  from  屬性) 的所有  <author>  項目。
 author[last-name = /editor/last-name]  包含  <last-name>  項目 (這些項目與根項目下的  <editor>  項目內部之  <last-name>  項目相同) 的所有  <author>  項目。
 author[. = "Matthew Bob"]  字串值為  Matthew Bob  的所有  <author>  項目。


比較優先順序
資料型別的相關比較會遵循優先順序。
IF 至少有一個運算元是布林值 THEN 將每一個運算元轉換成布林值
ELSE IF 至少有一個運算元是數字 THEN 將每一個運算元轉換成數字
ELSE IF 至少有一個運算元是日期 THEN 將每一個運算元轉換成日期
ELSE 將兩個運算元轉換成字串。

二進位比較運算子

一組二進位比較運算子會比較數字和字串並傳回布林值結果。<、<=、> 和 >= 運算子分別用於小於、小於或等於、大於,以及大於或等於。可在運算式中將單引號或雙引號當做字串分隔符號。這使得從指令碼語言中建構和傳遞模式變得更容易。

範例
運算式 表示
 author[last-name = "Bob" and price &gt; 50]  內含  <last-name>  項目 (含值  Bob ) 和  <price>  項目 (其值大於 50) 的所有  <author>  項目。
 degree[@from != "Harvard"]  包含不等於  "Harvard"  的  from  屬性之所有  <degree>  項目。
 author[last-name &gt;= "M"]  包含  <last-name>  項目 (其值以字母 M 或之後的字母開頭) 的所有  <author>  項目。
 book[position() &lt;= 3]  XML 檔中的前三個  <book>  項目 (1、2、3)。


範例
XML
<?xml version="1.0"?>
<test>
<x a="1">
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
</x>

<x a="2">
<y>y2</y>
</x>

<x a="3">
<y>y3</y>
</x>
</test>


XSLT
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<!-- Suppress text nodes not covered in subsequent template rule. -->
<xsl:template match="text()"/>
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="*|@*"/>
<xsl:if test="text()">
<xsl:value-of select="."/>
</xsl:if>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="/test">
<xsl:apply-templates select="//x[position() = 1 ] "/>
</xsl:template>
</xsl:stylesheet>


輸出結果
<x a="1">
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
</x>
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
<x>
<y>y31</y>
<y>y32</y>
</x>

2009年4月29日

XPath布林、比較與設定運算式

篩選條件模式
篩選條件模式可包含布林運算式、比較運算式和設定運算式。下列表格所示的捷徑代表這個 XSL 轉換 (XSLT) 實作中所提供的替代符號。
運算子說明
 and 邏輯and
 or 邏輯or
 not() 否定
 = 相等
 != 不相等
 &lt;* 小於
 &lt;=* 小於或等於
 &gt;* 大於
 &lt;=* 大於或等於
 | 設定運算;傳回兩組節點的聯集

下表顯示了比較運算子與布林運算子的優先順序 (從最高優先順序到最低優先順序)。
1 ( ) 群組
2 [ ] 篩選常式
3 /  // 路徑運算
4 < or &lt;  <= or &lt;=  > or &gt;  >= or &gt;= 比較
5 =  != 比較
6 | 等位
7 not() 布林值not
8 And 布林值and
9 or 布林值or


在 XML 文件 (例如 XSLT 樣式表) 中使用運算子時,必須分別將 < 和 > 語彙基元逸出為 < 和 >。例如,下列 XSLT 指令會在其 項目數值小於或等於 10 的所有 項目上,呼叫 XSLT 範本規則。
<xsl:apply-templates select="book[price &lt;= 10]"/>


搭配使用 XPath 運算式與 DOM 時,不需要逸出 < 和 > 運算子。例如,下列 JScript 陳述式將選取其 項目數值小於或等於 10 的所有 項目。
var cheap_books = dom.selectNodes("book[price <= 10]");


布林運算式可比對特殊值的所有節點,或在特定範圍內的所有節點。以下的布林運算式範例會傳回 false。
1 >= 2


運算子是區分大小寫的。

and 和 or 運算子

布林運算子 and 和 or 會分別執行邏輯 and 和邏輯 or 運算。搭配使用這些運算子與群組括號,即可建立複雜的邏輯運算式。
範例
運算式表示
 author[degree and award] 至少包含一個 <degree> 項目和至少一個 <award> 項目的所有 <author> 項目。
 author[(degree or award) and publication] 至少包含一個 <degree> 或 <award> 項目,和至少一個 <publication> 項目的所有 <author> 項目。


not運算子
布林 not 運算子可反轉篩選條件模式中的運算式值之正負。
範例
運算式表示
 author[degreeand not (publication)] 至少包含一個 <degree> 項目,且不含 <publication> 項目的所有 <author> 項目。
author[not (degree or award) and publication]至少包含一個 <publication> 項目,且不含任何 <degree> 項目或 <award> 項目的所有 <author> 項目。


範例
XML 檔
<?xml version="1.0"?>
<test>

<x a="1">
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
</x>

<x a="2">
<y>y2</y>
</x>

<x a="3">
<y>y3</y>
</x>

</test>


XSLT 檔
下列 XSLT 樣式表會選取不含任何屬性的所有 項目。
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

<!-- suppress text nodes not covered in subsequent template rule -->
<xsl:template match="text()"/>

<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="*|@*"/>
<xsl:if test="text()">
<xsl:value-of select="."/>
</xsl:if>
</xsl:element>
</xsl:template>

<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>

<xsl:template match="/test">
<xsl:apply-templates select="//x[not(@*)] "/>
</xsl:template>

</xsl:stylesheet>


輸出

套用以上的 XML 檔轉換會產生下列結果:
<x>
<y>y31</y>
<y>y32</y>
</x>