Course materials by the week:
Homework assignments:
跑出結果的 ... 如下:
<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML1.0Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>XMLS</title></head>
<body><h1>Title of article</h1>
<h2>Author of article</h2>
<h3>20081209-000628</h3>
<p id=\"test\">Put here whatever elements allowable in the body of an HTML document.</p>
<p><em>These two paragraph elements</em> are just fine!</p>
</body>
</html>
想請問老師那段
<p id=\"test\">Put here whatever elements allowable in the body of an HTML document.</p>
為什麼其中
<p id=\"test\">會多跑出兩個 \ 呢?
Answer:
Question:你可以用 PHP 的 stripslashes 函數,將 \ 字元從字串中拿掉: stripslashes($content) 說明及範例: > http://tw2.php.net/stripslashes 另外,這一部份,若你不處理元素中的屬性質,也就是 id="test" 等的情形,也沒有關係。我瞭解!
Answer:函數 writeRss 的部份,請再提示一下。
這部份,要先判斷是否已有一個 rss.xml 檔案,若無,要新增一個檔案。
然後就剛新產生的 HTML 相關資訊,準備成一個 item 元素,放在所有
item 元素之前。通常的作法是將 rss.xml 檔案,解析成 DOM 物件,
再來處理。可參考以下程式片段:
$rss = null;
$root = null;
$firstItem = null;
if(!file_exists($rssname)){
$rss = new DOMDocument('1.0', 'utf-8');
$root = $rss->createElement("rdf:RDF");
$root->setAttribute("xmlns:rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
$root->setAttribute("xmlns", "http://purl.org/rss/1.0/");
$channel = $rss->createElement("channel");
$channel->setAttribute("rdf:about", HOME_URL);
.....
$root->appendChild($channel);
$rss->appendChild($root);
}
else{
$rss = new DOMDocument;
$rss->load($rssname);
$root = $rss->documentElement;
......
}
$item = $rss->createElement("item");
.....
if($firstItem == null){
$root->appendChild($item);
}
else{
$root->insertBefore($item, $firstItem);
}
$s = $rss->saveXML();
writeFile($rssname, $s);
Question:
1. 程式範例中, validthis 這個函數定義中,以下的片段, $snoopy->submit 只傳兩個參數:
if($snoopy->submit($submit_url,$submit_vars)){
....
}
但在 Snoopy.class.php 檔案中,函數 submit 卻有三個參數,這 OK 嗎?
2. 另外,能否給一些提示,validthis 要如何作?
Answer:
1. 這是 OK 的。 在 Snoopy.class.php 檔案中,函數 submit 三個參數的後兩個,
有內定值,所以呼叫時,不傳參數值過去,是 OK 的。
2. $snoopy->submit($submit_url,$submit_vars) 是呼叫 W3C 的 HTML validator
來看你所準備好的 HTML檔案,是否為 valid 。你可以就 $snoopy 所傳回的值,來判斷 validation 是否成功。有兩個方式可以判斷:
一種方式是看 $snoopy->results 的部份(會是一份 HTML 文件),其中關鍵的部份是 "valid" 或是
"invalid"。 (再提示:請看 body 元素下的第二個 div 元素下的 h2 元素的 class 屬性值)。
另一種方式是看 $snoopy->headers 的部份(會是一個陣列),再眾多 header 中,
其中 X-W3C-Validator-Status 的值是 "Valid" 還是 "Invalid"。
請到 HTTPTest 網頁(這個我們講過 Week9):
http://www.garshol.priv.no/download/HTTPTest.html
分別輸入:
http://validator.w3.org/check?url=http://www.iis.sinica.edu.tw/~trc/public/courses/Fall2008/
http://validator.w3.org/check?url=http://www.iis.sinica.edu.tw/
用 HTTP HEAD 的方式來看就知道了。
Question:
Answer:我將很長的字串資料放入 PHP 的變數時,常會發生 parsing 出錯的情形。 例如放在 $htmlheader 變數中,關於 XML declaration 的資料、HTML header 的資訊等。
Question:為避免 PHP parsing 出錯的麻煩,可以使用 PHP 的 heredoc syntax ,將一大串字串資料, 於 <<< 之後,放在兩個相同的 identifiers 之間,如以下的例子(heredoc syntax 請見 http://tw.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc): $htmlfooter=<<<HTMLHEAD </body> </html> HTMLHEAD;
Answer:老師你好,有關於作業四有以下幾點問題請教: 1.寫得程式是只要寫parse.php裡面的...的內容而已嗎? 2.本次作業有需要像老師上課範例一樣,寫個story.xsl? 3.$htmlheader = .... $htmlfooter = .... 這兩個變數的意義分別是? 4.post.html送出之後導到parse.php,產生出來的頁面顯示畫面要跟parse.php一模一樣嗎?
> 1.寫得程式是只要寫parse.php裡面的...的內容而已嗎? 是的。 > 2.本次作業有需要像老師上課範例一樣,寫個story.xsl? 不需要。(這次要產生的XML檔案的內容來自使用者填入的資料,不是來自另一份XML檔案。) > 3.$htmlheader = .... > $htmlfooter = .... > 這兩個變數的意義分別是? 用來記住所產生 HTML 檔案中,最前頭和最後頭的部份。(不會變動,每次都一樣。) > 4.post.html送出之後導到parse.php,產生出來的頁面顯示畫面要跟parse.php一模一樣嗎? 不。這部份你可以自行設計。
Answer:由於hw2做出的格式不完全符合html範本所示,想請問:我們是否可以直接引用老師的html做css的套用。如此可能會比較有一致性。
Question:我想這是 OK 的。 你們也可就自己所產生(不完全符合)的 html 文件,來做 styling 。 這就讓你們自己來選吧!
Answer:請問第三次的作業 是只要用同一份css產生兩份不同的結果嗎?一個是pdf,一個是html 所以只有在原始xhtml引進時的media不同,其它通通相同,是同一個css?
> 是只要用同一份css產生兩份不同的結果嗎?
> 一個是pdf,一個是html
是的。在
1. Write a stylesheet qaml2html.css for the generated XHTML documents. ..
的部份,你只要寫一份 CSS 。這份 CSS 於瀏覽器顯示和列印時,分別有 png 檔和 pdf 檔所示範的視覺效果。
不過,在
2. Write a new stylesheet my-qaml.css for QAML documents, and a new stylesheet my-qaml2html.css for the generated XHTML documents.
的部份,你還要寫以上兩個自己設計的 CSS 。
Answer:老師: 你的作業裡面包括了兩個xml檔案 一個是qaml 一個是xml10points 請問我們是要寫一個xsl檔案 然後兩個都可以轉成老師要的格式嗎?? 還是只要轉qaml就好???
Question:寫同一個 xsl 檔案。但這個 xsl 要能同時處理那兩個檔案, 將他們轉成所要求的 HTML 檔案。
Answer:這樣的話nubering的問題會變得很奇怪 qaml的title裡面原本就有umbering 可是xml10points的numbering要自己加 加了以後qaml就會變重複了 還是有別的方法可以判斷?
這可以從 QAML 文件中, body 與 section 元素中 autonum 屬性的屬性值是否有設為 yes 來判斷。
在 xml10points.xml 中,可以看到
<body xml:lang="en" autonum="yes"> ... </body>
<section id="intro" class="intro" autonum="yes">
但在 qaml-faq 中,並沒有這樣的設定。
在 qaml-xml.dtd 中,有提到:
If you do not put your own numbers in titles, you can signify this
by specifying the autonum attribute on a body or section to "yes".
所以你寫的 xsl 程式,要判斷 autonum 的值,並依此用
<xsl:number level= .... count= .... format= .... />
來處理。
Question:
Answer:目前問題如下: 1.依網址找不到xml10points.xml 只有html檔 2.要求的add back link是指什麼呢?
Question:
- 作業網址 上,提到
xml10points.xml與qaml-faq.xml兩處,皆有提供超連結到那兩個檔案。- 作業中所說的 "adds back links (to the table of contents)" 指的是:所產生 HTML 文件的本文中,於各段落之後,皆會有 "[Table of Contents]" 的字樣,提供超連結到該段落在「目次表」("Table of Contents")中的位置。例如:所產生的檔案
qaml-faq.html之中, "A.1. What is a FAQ?" 該段落之後的 "[Table of Contents]",以 <a href="#toc-a1"> ... </a> 的方式,連結回到目次表。
Answer:要從檔案 xml10points.xml 產生 "Table of Contents" 時,不知道如何排出兩層的 "A.1. XML is for structuring data", "A.2. XML looks a bit like HTML" 等標題目次。
好吧!那就參考以下的程式片段:
<xsl:template match="body" mode="toc"> <hr/> <div class="toc"> <h2 class="toc">Table of Contents</h2> <xsl:for-each select="section"> <h4><a name="toc-{@id}" href="#{@id}"> <xsl:if test="../@autonum='yes'"> <!-- Do the autonumbering if my parent element says so. --> <xsl:number count="section" format="A."/><xsl:text> </xsl:text> </xsl:if> <xsl:value-of select="title"/></a></h4> <xsl:for-each select="section"> <!-- Dealing with section elements inside section elements. --> <a name="toc-{@id}" href="#{@id}"> <xsl:choose> <xsl:when test="../../@autonum='yes' and ../@autonum='yes'"> <!-- Both my grandparent and my parent want me to do autonumbering. --> <xsl:number level="multiple" count="qna|section" format="A.1."/> <xsl:text> </xsl:text> </xsl:when> <xsl:when test="../@autonum='yes'"> <!-- My parent wants me to do autonumbering but my grandparent does not. --> <xsl:number count="qna|section" format="1."/> <xsl:text> </xsl:text> </xsl:when> </xsl:choose> <xsl:value-of select="title"/></a><br/> </xsl:for-each> <xsl:for-each select="qna"> ... <!-- What to do with qna elements? --> </xsl:for-each> </xsl:for-each> </div> <hr/> </xsl:template>