Jian-hua Yeh (葉建華) 真理大學資訊科學系助理教授 au4290@email.au.edu.tw 數位圖書館 – XML/DTD理論與實務 Jian-hua Yeh (葉建華) 真理大學資訊科學系助理教授 au4290@email.au.edu.tw
Course Outline 標示(Markup)的基本概念 SGML介紹 XML介紹 XML相關標準 XML的應用 DTD介紹
顧名思義 SGML – Standard Generalized Markup Language (標準通用標示語言) XML – Extensible Markup Language (可延伸標示語言) HTML – HyperText Markup Language (超文件標示語言)
標示(Markup) 的基本觀念 藉著標示傳達某些關於被標示文字的資訊 標示的種類 程序性標示 (Procedural Markup) : 針對文件的呈現外觀進行標示 例如:Microsoft Word、PDF 描述性標示 (Descriptive Markup) : 針對文件的內容和語義結構進行標示 例如:SGML、XML
程序性標示 (Procedural Markup) 針對文件的呈現外觀進行標示 所見即所得 (What You See Is What You Get) 文件的呈現樣式與內容儲存在同一份檔案 方便個人使用 通常使用專屬的控制碼(ex. binary code),無法跨系統、跨平台
描述性標示 (Descriptive Markup) 針對文件的內容和語義結構進行標示 文件的內容與呈現樣式分開 呈現時須結合樣式表(stylesheet) 使用ASCII code,可以跨系統、跨平台 利於大量文件的長期保存、交換與再利用
描述性標示的呈現 電子文件無法跨平台交換的主因是:不同的文書處理系統,在文件的呈現細節上採用不同的紀錄格式,這裡的呈現細節指的是字形的大小、字體的選擇、段落的表示、版面的設定之類的處理,這些都是屬於 platform-depedent 的特性。SGML將文件內容與呈現格式區分開來,只描述文件內容的語意結構,至於文件的呈現格式部份,留待文件最後輸出時,再配合 style sheet 標準,來定義呈現格式。 SGML可以讓 user 自行定義 tag 來描述文件內容的語意結構。文獻作者為了方便自己寫作和讀者閱讀,通常都會依據自己的思想綱要,將文獻的內容安排成合適的語意結構。例如一本書可以分成許多章,每一章可以分成許多節;一封書信可以分成寄件人、本文、收件人等部分等。標示了語意結構的 SGML 文獻,便具有了再利用的功能。
描述性標示文件與樣式表分開 一份描述性標示文件可以使用不同的樣式表→ 提高描述性標示文件的再利用性 多份描述性標示文件可以使用同一份樣式表→視覺設計維護更為容易
XML的發展背景 HTML的許多特性已經限制了Web的發展。XML的發展成員大都對SGML及結構化的資訊(structured information)有相當豐富的應用經驗,他們相信引進SGML技術,能夠彌補HTML的不足。 XML─取SGML之長,補HTML之短。
HTML的限制 HTML大部分的標籤是用來控制線上顯示,無法描述較複雜的文件結構。 HTML的標籤集是固定的,使用者不能自行定義標籤。 不同廠商所發展的 HTML Extension 不相容。
SGML (Standard Generalized Markup Language) 1986年 ISO 所制定的標準-ISO 8879 主要是為了文件交換與電子出版的使用而設計,用來描述文件結構,使得電子文件能在不同軟體系統間交換與傳輸。 是一套訂定標示語言的元語言(meta-language),使用者可根據需求自行定義標籤,再以這些標籤來描述文件結構。
SGML的優點 有彈性 (flexibility) : 能描述任何的資訊結構與任何複雜的文件。 非專屬性 (non-proprietary)、平台獨立性(platform-independence) 與系統獨立性 (system-independence) : 利於文件的交換與長期保存。 資訊再利用性 (re-usability)
SGML的缺點 SGML標準規格過於複雜。 SGML開發相關應用軟體的成本相當高。 SGML文件不易在Web上傳佈。
XML (Extensible Markup Language) W3C在1996年底提出的標準。 從SGML衍生出來的簡化格式,也是一種元語言(meta-language) 1998/2,XML1.0 Recommendation 已獲得各界的支持,其中包括了Sun Microsystems, Microsoft, Netscape, Adobe, ArborText,...等軟體大廠的背書
XML的設計目標 XML能直接在Internet上使用: XML能與SGML相容: 處理XML文件的程式能很容易被開發: …..
XML文件實例 以下是XML文件片段: <customer-details id="AcPharm39156"> <name>Acme Pharmaceuticals Co.</name> <address country="US"> <street>7301 Smokey Boulevard</street> <city>Smallville</city> <state>Indiana</state> <postal>94571</postal> </address> </customer-details>
SGML、HTML、XML的關係 SGML(1986) HTML─SGML的兒子(1996, HTML 3.2) XML─SGML的弟弟(1998, XML 1.0) XML─比 HTML 晚出生的叔叔 XML是SGML的簡化,而非HTML的延伸
W3C 的資料格式
XML與SGML之比較─相同點 都是一種 Meta-Language,可以支援各種不同的應用。 都具備可擴展性 (extensibility)、結構性(structure) 與可確認性(validation)等優點,能夠描述各種複雜的文件結構,並可藉由DTD來確保文件結構的完整性與正確性。 都須結合樣式表來設定文件內容的呈現格式。 都具備跨平台、可長期保存、可再利用、能被人直接閱讀等特性。
XML與SGML之比較─相異點 對SGML文件而言,DTD是必備的;而對於XML文件而言,DTD不是必備的。 SGML的使用者可以使用包含 (Inclusion)與除外(Exclusion) 這兩種語法規則來指定內容模式(content model) 的例外處理(Exceptions);XML則不支援例外處理。 XML不支援AND(&)內容模式、SDATA內部實體(internal entities)…等語法。 對SGML文件而言,DTD是必備的;而對於XML文件而言,DTD不是必備的。Well-formed XML文件沒有DTD,Valid XML文件則有DTD。 所有的XML文件都必須符合下列Well-formedness規則: 包含一個以上的元素(elements)。 恰有一個根元素(root),不出現在其他元素的內容之中 所有的元素都有起始標籤與結束標籤,也就是標籤必須成對。 所有的標籤必須呈現適當的巢狀(nest)結構。 空標籤(empty tags)必須遵守特殊的XML語法。(如<empty/>) 所有的屬性值都必須括上單引號或雙引號。 所有的實體都必須宣告。 SGML的使用者可以使用包含(Inclusion)與除外(Exclusion)這兩種語法規則來指定內容模式(content model)的例外處理(Exceptions);XML則不支援例外處理。 XML不支援AND(&)內容模式、SDATA內部實體(internal entities)…等語法。
XML與HTML之比較
XML文件 Well-formed XML文件 Valid XML文件 所有的XML文件都須符合Well-formed XML 規則 沒有參引DTD Valid XML文件 參引DTD 所有的XML文件都須符合Well-formed XML 規則
Well-formed XML 規則 包含一個以上的元素。 恰有一個根元素。 不能省略起始標籤或結尾標籤。(如<p>…..</p>) 所有的 標籤必須呈現適當的巢狀 (nest) 結構。 ( 如 <B><I>bold and italic</B>italic</I> 是不允許的 ) 空標籤必須遵守特殊的XML語法。 ( 如 <img src=“…”/> ) 所有的屬性值必須括上單引號或雙引號。 ( 如 <font size=“2”> )
寫一份Well-Formed XML文件 步驟1 : 撰寫 XML宣告 步驟2 : 撰寫根元素 步驟3 : 撰寫其他XML標籤與內容 步驟4 : 剖析(parsing) XML文件
步驟1:撰寫 XML宣告 <?xml version=”1.0”?> <?xml version=”1.0” encoding=”UTF-8” ?> <?xml version=”1.0” encoding=”big5” ?>
步驟2:撰寫根元素 <?xml version=”1.0” encoding=“big5” ?> <record-list> …… </record-list>
步驟3:撰寫其他XML標籤與內容 <?xml version="1.0" encoding="big5"?> <record-list> …. <record> <seq>1</seq> <title>XML及RDF技術介紹</title> <creator>梁高榮</creator> <journal>機械工業</journal> <vol>220</vol> <date>90.07</date> ….. <url>http://www2.read.com.tw/…..</url> </record> </record-list>
一份正確的Well-formed XML文件在Microsoft Internet Explorer 6.0 的瀏覽結果
一份有語法錯誤的XML文件在Microsoft Internet Explorer 6.0 的瀏覽結果
XML的樣式表(Style Sheet) XSL (Extensible Stylesheet Language) W3C Recommendation, 2001/10/15 CSS (Cascading Style Sheet) W3C Recommendation
CSS(Cascading Style Sheet) 較XSL簡單 已是W3C的正式標準 主流瀏覽器已支援
如何使用CSS樣式表 在XML中呼叫CSS樣式表 <?xml version=“1.0” standalone=“no” ?> <?xml-stylesheet href=“*.css” type=“text/css” ?> 呼叫的樣式表不存在或為空檔案,則使用內定值 最後的顯示方式=繼承的顯示方式+自訂的顯示方式 不可以使用中文標籤 屬性與屬性值大小寫相同
CSS的屬性與屬性值 與文字相關的屬性 與方框有關的屬性 與版面有關的屬性 字型設定、文字大小、文字粗細、文字樣式、文字位置、線段設定、文字縮排、文字大小寫設定 與方框有關的屬性 方框設定、框線顏色、框線形式、框線寬度 與版面有關的屬性 背景顏色、顯示方式、位置、寬度、與邊緣距離
XSL 樣式表 XSL文件是well-formed XML文件 XSL包含大多數的CSS 功能 XSL包含兩個部分: XSLT(XSL Transformations) 1.0 W3C Recommendation ; 1999/11/16 一組排版指令 (formatting object) 的 XML 標示: XSL 1.0 W3C Recommendation; 2001/10/15
XSL 與 CSS 的比較 XSL CSS 能否使用在 HTML ? no yes 能否使用在 XML ? 是不是轉換語言 ? 使用語法 ?
XSLT 的應用 XML XML XML HTML (XHTML) XSL XSL 可以用來做不同 Metadata 交換資訊時的轉換 XML HTML (XHTML) 轉換後的 HTML 必須是 well-formed XSL XSL
XSLT 的網路應用 在 Server 端做轉換: 在 Client 端做轉換: Real-time 轉換: Server Load 較重 Batch 轉換:Server Load 較輕 在 Client 端做轉換: Browser 對 XSLT 的支援可能不完整 !? 接到 http request,根據 browser type,再決定是要由Server 端做轉換,或是由Client 端做轉換。
XSL處理器的工作原理 解讀XML文件樹狀結構(source tree),並產生暫時性的樹狀結構(result tree) 對結果樹文件做排版,產生可由瀏覽器顯示的文件
如何使用XSL樣式表 在XML中呼叫XSL樣式表 呼叫的樣式表不存在,會出現錯誤訊息 可以使用中文標籤 屬性與屬性值大小寫不同 <?xml version=“1.0” standalone=“no” ?> <?xml-stylesheet href=“*.xsl” type=“text/xsl” ?> 呼叫的樣式表不存在,會出現錯誤訊息 可以使用中文標籤 屬性與屬性值大小寫不同
XSL元素 與樣本有關的元素 與資料有關的元素 條件式控制元素 其他元素
與樣本有關的XSL元素 xsl:stylesheet xsl:template xsl:value-of xsl:for-each match屬性 xsl:value-of select 屬性 xsl:for-each xsl:apply-templates
與資料有關的XSL元素 xsl:comment xsl:copy xsl:attribute xsl:element
XSL的條件式控制元素 xsl:if xsl:choose xsl:when xsl:otherwise
連結XSL樣式表的XML文件 <?xml version="1.0" encoding="big5"?> <?xml-stylesheet href="ncl_journal_search_2.xsl" type="text/xsl" ?> <record-list> …. <record> <seq>1</seq> <title>XML及RDF技術介紹</title> <creator>梁高榮</creator> <journal>機械工業</journal> ….. </record> </record-list>
一份結合XSL的XML文件在Microsoft Internet Explorer 6.0 的瀏覽結果
XML相關標準制定現況 XML 1.0 : Namespaces in XML: XSLT : XML Schema : W3C Recommendation 10-Feb-1998 Namespaces in XML: W3C Recommendation 14-Jan-1999 XSLT : W3C Recommendation 16-Nov-1999 XML Schema : W3C Recommendation 2-May-2001 XHTML 1.1 : W3C Recommendation 31-May-2001 XLink : W3C Recommendation 27-June-2001 XSL : W3C Recommendation 15-Oct-2001
XHTML與HTML的不同(1/6) 文件必須是 well-formed Example: CORRECT: nested elements <p>here is an emphasized <em>paragraph</em>.</p> INCORRECT: overlapping elements <p>here is an emphasized <em>paragraph.</p></em>
XHTML與HTML的不同(2/6) 元素與屬性名稱是小寫 Example: CORRECT: INCORRECT: <li>…. INCORRECT: <LI>….
XHTML與HTML的不同(3/6) 除了空元素外,都必須有結尾標籤。 Example: CORRECT: terminated elements <p>here is a paragraph.</p> <p>here is another paragraph.</p> INCORRECT: unterminated elements <p>here is a paragraph. <p>here is another paragraph.
XHTML與HTML的不同(4/6) 所有屬性值都必須加引號 Example: CORRECT: quoted attribute values <table rows="3"> INCORRECT: unquoted attribute values <table rows=3>
XHTML與HTML的不同(5/6) 屬性不能採用簡化表示法 Example: CORRECT: unminimized attributes <dl compact="compact"> INCORRECT: minimized attributes <dl compact>
XHTML與HTML的不同(6/6) 空元素的表示法 Example: CORRECT: terminated empty tags <br/><hr/> INCORRECT: unterminated empty tags <br><hr>
XML的應用 資料庫交換 Client端的文件處理 一份內容,多種呈現 資訊過濾 資訊再利用
XML應用實例─新浪網與國家圖書館合作案
XML應用實例─新浪網與國家圖書館合作案
系統架構圖 新浪網伺服器 國圖伺服器 User (2) 將查詢請求導向國圖伺服器 (3)將查詢結果以XML格式傳回 (4) 將XML轉成 HTML網頁傳回Client端 (1)送出查詢請求 (5) 點選metadata取得更多資訊 系統架構圖 User
甚麼是DTD 文件型態定義 DTD 的概念緣於 SGML,每一份 SGML 文件一定參考到一份 DTD (Document Type Definition) DTD 的概念緣於 SGML,每一份 SGML 文件一定參考到一份 DTD XML 沿用了 DTD 的概念,但一份 XML 文件可以自由選擇是否參引 DTD Well-formed XML文件:沒有參引DTD Valid XML文件:參引DTD
DTD的功能 定義該類型的文件所包含的元素(Element),並定義每個元素的內容,包含子元素與屬性。
DTD的組成 元素(Elements) 屬性(Attribute) 實體(Entities) 註解(Comments)
XML DTD / 元素(Elements) 非空元素(non-empty element) 空元素(empty element) 元素之下還有子元素或者元素包含內容 空元素(empty element) 元素之下沒有任何的子元素或內容 不做限制的元素 元素之下可以包含任何被宣告過的元素或文字資料(#PCDATA) 這些被包含的元素出現順序與次數皆不受限制。
非空元素的宣告 <!ELEMENT From (#PCDATA)> 語法如下: 如: <!ELEMENT Email (From,Date,To+,Subject,Body?)> 元素名稱 元素內容 <!ELEMENT From (#PCDATA)> (#PCDATA) 代表該資料型態是可被剖析的文字資料 (Parsed Character DATA)
非空元素的使用 <?xml version=“1.0” standalone=“no”> <!DOCTYPE Email SYSTEM “http://ross.edu.tw/dtd/email.dtd”> <Email> <From>Joe</From> <Date>1999-7-14 AM 09:20</Date> <To>Jay</To> <To>Jennifer</To> <Subject>Learning XML</Subject> <Body>學XML就像學HTML一樣簡單</Body> </Email> 內容包含了 From, Date, To, Subject, Body 等子元素 內容是純文字
空元素的宣告與使用 語法如下: 如: 使用實例: <!ELEMENT 元素名稱 EMPTY> <!ELEMENT br EMPTY> 使用實例: ……… <br/> 元素名稱
不做限制的元素宣告 語法如下: 如: <!ELEMENT 元素名稱 ANY> <!ELEMENT comment ANY>
XML DTD / 元素的 內容模型(Content Model) ( ) A? A+ A* (A | B | C) (A, B, C) 一個表示式 A 可出現一次,或不出現 (0 or 1次) A 可重複出現,且至少出現一次 (1次以上) A 可重複出現,或不出現 (0次以上) A, B, C 任選一,且僅能有一 A, B, C 同時出現,且出現順序為 A, B, C
混合型(Mixed) 內容模型 當一個元素內容包含文字資料與子元素時,稱做混合型內容 語法: 無法限制各元素出現順序與次數 <!ELEMENT 父元素 (#PCDATA | 子元素1 | 子元素2 | ……| 子元素n)*> 或 <!ELEMENT 父元素 (#PCDATA | 子元素1 | 子元素2 | ……| 子元素n)+> 無法限制各元素出現順序與次數
XML DTD / 屬性(Attributes) 提供元素額外的描述資訊 屬性值可設定預設值或以列舉的方式來限定。 語法: <!ATTLIST 元素名稱 屬性名稱 屬性值型態 屬性的內定值>
幾種常用的屬性值資料型態 CDATA : Character DATA,代表一般文字。 將可能的屬性值列舉出來,應用時屬性值必須採用列舉值的其中之一。 NMTOKEN : 英文字母、數字、“_”、“-” 、“.”、“:” NMTOKENS : 一個以上的 NMTOKEN 所組成,之間以空白隔開 ID : 屬性值在設定時值必須是唯一的 NOTATION : 屬性值是 DTD 宣告的 NOTATION
屬性的內定值型態 #REQUIRED : 該元素一定需要設定該屬性值 #IMPLIED : 該元素不一定要設定該屬性值 #FIXED : 有固定的屬性值 預設的字串:若沒有指定屬性值,則採用預設值
屬性宣告實例(1/2) <!ELEMENT Tel (#PCDATA)> <!ATTLIST Tel Zone CDATA #IMPLIED> 元素名稱 屬性名稱 使用實例: …… <Tel Zone=“02”>27819126</Tel> ….
屬性宣告實例(2/2) <!ELEMENT Name (#PCDATA)> <!ATTLIST Name Sex (M | F) #REQUIRED> 列舉值 使用實例: …… <Name Sex=“M”>Joe</Name> ….
XML DTD / 實體(Entities) 範例: <!ENTITY ROSS “Resource Organization and Searching Specification”> Metalogy is produced by the research group under &ROSS.
XML DTD / 註解(Comments) 範例: <!--3 ELEMENT 版本名稱 (#PCDATA) --> <!ELEMENT editionName (#PCDATA) > <!--ATTLIST 版本名稱 使用代碼 FIXED "npm-doc-editionName"--> <!ATTLIST editionName scheme FIXED "npm-doc-editionName">
如何開發 DTD 分析文獻結構 確認所包含的 elements 及每個 element 的規格 開始撰寫DTD 結構圖 每個元素的內容? 每個元素是必備還是可有可無? 每個元素的屬性與屬性值? 開始撰寫DTD 註解
Email 的文件結構 Email From Body Date Subject To 根元素 Email 的子元素 這是一份 SGML DTD 的片段,主要是定義該種文獻類型所包含的 elements,及 elements 在文獻中出現的順序與每個 element 的屬性。 Date Subject To
XML …. 文獻DTD …. …. XML與XML DTD的關係 書畫DTD 器物DTD 器物甲 器物乙 器物丙 印刷版本 虛擬實境版本 SGML可因針對不同的文獻類型,定義不同的 DTD。 依據 DTD,可以標誌出不同內容的 DI。 每個 DI 又可有不同的呈現格式。 …. 印刷版本 虛擬實境版本 Web Page版本
使用DTD的好處 統一文件格式:藉DTD來進行文件內容與結構的驗證。 提高文件的再利用性
使用DTD的代價 如果文件結構過於複雜,訂定出完整且具擴充彈性的DTD相對不易。 必須搭配相關的應用程式或剖析器(parser)才能發揮DTD的作用。
如何取得 DTD? 使用某單位或某人已開發的DTD. 自行開發DTD. <!DOCTYPE Email PUBLIC “-//OPEN DTD//DTD Email//EN” “http://opendtd.org/dtd/email.dtd”> 自行開發DTD. <!DOCTYPE Email SYSTEM “http://ross.edu.tw/dtd/email.dtd”>
Valid XML 文件 一份附帶有外部或內部DTD的Well-formed XML 文件,並且文件內容符合DTD所定義的文件格式,稱之為Valid XML文件。
寫一份Valid XML文件 步驟1 : 撰寫 XML宣告 步驟2 : 設計一個DTD. 步驟3 : 撰寫XML標籤與內容 步驟4 : 驗證(validating) XML文件
步驟1:撰寫 XML宣告 <?xml version=”1.0”?> <?xml version=”1.0” encoding=”UTF-8” ?> <?xml version=”1.0” encoding=”big5” ?>
步驟2: 設計一個DTD <!-- Elements Content --> <!-- ----------- ----------------------------> <!ELEMENT Email (From,Date,To+,Subject,Body?)> <!ELEMENT From (#PCDATA)> <!ELEMENT Date (#PCDATA)> <!ELEMENT To (#PCDATA)> <!ELEMENT Subject (#PCDATA)> <!ELEMENT Body (#PCDATA)> <!-- End of Email DTD -->
步驟3 : 撰寫XML標籤與內容 DTD宣告 內部(Internal) DTD 宣告 外部(External) DTD 宣告
內部DTD宣告實例 根元素 DTD規則 根標籤 <?xml version=“1.0”> <!DOCTYPE Email [ <!ELEMENT Email (From,Date,To+,Subject,Body?)> <!ELEMENT From (#PCDATA)> <!ELEMENT Date (#PCDATA)> <!ELEMENT To (#PCDATA)> <!ELEMENT Subject (#PCDATA)> <!ELEMENT Body (#PCDATA)> ]> <Email> <From>Joe</From> <Date>1999-7-14 AM 09:20</Date> <To>Jay</To> <To>Jennifer</To> <Subject>Learning XML</Subject> <Body>學XML就像學HTML一樣簡單</Body> </Email> DTD規則 根標籤
外部DTD宣告實例(1/2) <?xml version=“1.0” standalone=“no”> <!DOCTYPE Email SYSTEM “http://ross.edu.tw/dtd/email.dtd”> <Email> <From>Joe</From> <Date>1999-7-14 AM 09:20</Date> <To>Jay</To> <To>Jennifer</To> <Subject>Learning XML</Subject> <Body>學XML就像學HTML一樣簡單</Body> </Email>
外部DTD宣告實例(2/2) (http://email.org/email.dtd) <?xml version=“1.0”> <!ELEMENT Email (From,Date,To+,Subject,Body?)> <!ELEMENT From (#PCDATA)> <!ELEMENT Date (#PCDATA)> <!ELEMENT To (#PCDATA)> <!ELEMENT Subject (#PCDATA)> <!ELEMENT Body (#PCDATA)>
利用XML SPY 4.3對XML文件進行驗證(1)-檢查文件是否well-formed
利用XML SPY 對XML文件進行驗證(2)-檢查文件是否Valid
Conclusion