彭 釗 吳 敏
【摘要】主要討論了在基于網(wǎng)絡(luò)的英語(yǔ)四六級(jí)自適應(yīng)學(xué)習(xí)系統(tǒng)中,通過 XSLT 轉(zhuǎn)換 XML 格式的學(xué)習(xí)內(nèi)容實(shí)現(xiàn)試卷的動(dòng)態(tài) 輸出,利用 JavaScript 腳本語(yǔ)言和 AJAX 技術(shù)改進(jìn)試卷的交互性和功能,從而使試卷輸出更加靈活,使用更加方便。
【關(guān)鍵詞】試卷;輸出;XSLT;JavaScript;AJAX
【中圖分類號(hào)】G434 【文獻(xiàn)標(biāo)識(shí)碼】B 【論文編號(hào)】1009—8097(2009)01—0113—03
一 引言
計(jì)算機(jī)、網(wǎng)絡(luò)和多媒體等信息技術(shù)的發(fā)展及其在教育中的應(yīng)用,促使遠(yuǎn)程教育在世界范圍內(nèi)展開。隨著遠(yuǎn)程教育的 發(fā)展,出現(xiàn)了一些比較突出的問題:如何使學(xué)習(xí)者正確評(píng)價(jià) 自己的能力并在浩瀚的學(xué)習(xí)資源中找到適應(yīng)自己學(xué)習(xí)能力和 學(xué)習(xí)風(fēng)格的教學(xué)內(nèi)容,如何使學(xué)習(xí)者在學(xué)習(xí)過程中得到及時(shí) 的反饋并能根據(jù)其調(diào)整自己的學(xué)習(xí)策略等[1]。為了解決這些問 題,自適應(yīng)的學(xué)習(xí)系統(tǒng)成為流行的趨勢(shì),作為一種“以學(xué)習(xí) 者為主體”的個(gè)別化的學(xué)習(xí)者自我監(jiān)控自我適應(yīng)的學(xué)習(xí)系 統(tǒng),能很好的解決上述問題。
在自適應(yīng)學(xué)習(xí)系統(tǒng)中,“試卷”輸出是系統(tǒng)中很重要的 一個(gè)功能。這里的“試卷”是指在學(xué)習(xí)者接受能力測(cè)試或者 進(jìn)行練習(xí)時(shí),系統(tǒng)將測(cè)試內(nèi)容或者學(xué)習(xí)內(nèi)容以試卷的樣式在 瀏覽器上呈現(xiàn)的網(wǎng)頁(yè)內(nèi)容。試卷的輸出承擔(dān)了收集用戶學(xué)習(xí) 信息,優(yōu)化系統(tǒng)交互性,向用戶呈現(xiàn)知識(shí)點(diǎn)和反饋學(xué)習(xí)結(jié)果 的功能。目前現(xiàn)有類似系統(tǒng)的試卷輸出,有的以固定的網(wǎng)頁(yè)形 式呈現(xiàn),有的雖然能動(dòng)態(tài)呈現(xiàn)內(nèi)容,但交互性較差,不能很好 地提供對(duì)學(xué)習(xí)者學(xué)習(xí)內(nèi)容的查詢以及學(xué)習(xí)結(jié)果的反饋等。
作者所在課題組在研發(fā)大學(xué)英語(yǔ)四、六級(jí)自適應(yīng)學(xué)習(xí)系統(tǒng)時(shí) 對(duì)試卷輸出的改善進(jìn)行了嘗試。本文主要討論基于 XSLT 語(yǔ)言 將XML 保存的學(xué)習(xí)內(nèi)容動(dòng)態(tài)地輸出成試卷,以及利用 JavaScript 腳本語(yǔ)言和 AJAX 技術(shù)改進(jìn)交互性和功能的過程和實(shí)現(xiàn)。
二 基于 XML 的試卷輸出實(shí)現(xiàn)
XML 有允許數(shù)據(jù)再利用,內(nèi)容與樣式分離,以及在應(yīng)用 程序間傳遞數(shù)據(jù)的眾多優(yōu)點(diǎn),我們選擇用 XML 保存學(xué)習(xí)內(nèi)容[2]。
XSLT 提供一套規(guī)則,用于將一組元素描述的 XML 數(shù)據(jù) 轉(zhuǎn)換成另一組元素描述的文檔,或者甚至是將該數(shù)據(jù)轉(zhuǎn)換為 一種自定義的文本格式。XSLT 通常用于將 XML 文檔轉(zhuǎn)換為 HTML,目的是可以在瀏覽器中進(jìn)行顯示[3]。圖 1 顯示了這個(gè) 轉(zhuǎn)換過程。
下面將討論利用 XSLT 將 XML 輸出成網(wǎng)頁(yè)的具體實(shí)現(xiàn)過程。
1試卷的 XML 結(jié)構(gòu)
一般的英語(yǔ)試卷總結(jié)起來可以分為四個(gè)層次,paper,part,section,item。Paper對(duì)應(yīng)試卷,由幾個(gè) part 組成,每個(gè) part 由若干 section 組成,每個(gè) section 包括若干的 item。在本學(xué)習(xí) 系統(tǒng)中,保存在數(shù)據(jù)庫(kù)中的是單個(gè)的題目,對(duì)應(yīng) item 層次。 在輸出成網(wǎng)頁(yè)試卷之前,我們要先從數(shù)據(jù)庫(kù)中根據(jù)試卷策略 選出對(duì)應(yīng)的題目,然后組成一份整個(gè)試卷所對(duì)應(yīng)的 XML,試 卷的具體 XML 結(jié)構(gòu)如下:
<paper name=”papername” >
<part type=”parttype” id=”partid”>
<section type=”sectiontype” id=”sectionid”>
<item id=”1”>
…..
</item>
<item id=”2”>
…..
</item>
…..
</section>
…..
</part>
……
</paper>
保存在數(shù)據(jù)庫(kù)中的 item 也是以 XML 的形式,這樣既利 于數(shù)據(jù)的傳輸,也利于試卷 XML 的生成。
2試題 XML 結(jié)構(gòu)的一些特殊情況
上面給出的只是 item 的一般的 XML 結(jié)構(gòu),對(duì)于比較復(fù) 雜的題型,需要添加一些額外的標(biāo)記。例如,選詞填空這類 題型,要保存給出的詞語(yǔ),我們必須要添加一個(gè)節(jié)點(diǎn)
<wordlist>
<word>…</word>
<word>…</word>
….
</wordlist>
題目有時(shí)候會(huì)缺少一些基本的節(jié)點(diǎn),比如 compound listening 這類題型,按照 item 的基本結(jié)構(gòu)就只有 content 節(jié)點(diǎn) 有內(nèi)容,這時(shí)候要輸出小題號(hào)就比較困難,因?yàn)橐话愕姆椒?是根據(jù) question 節(jié)點(diǎn)的 id 來輸出的,另外結(jié)合一般試卷都有 斜體、粗體以及下劃線的需求,我們定義了一組標(biāo)記,來確 定什么時(shí)候需要輸出這些內(nèi)容或者格式。比如標(biāo)記(#aaa#), 表示將內(nèi)容“aaa”加下劃線輸出。
3 XSLT 樣式表的基本結(jié)構(gòu)
<xsl:stylesheet>
<xsl:template match=”/”>
<xsl:for-each select=” /paper/part”>
<xsl:if test=./@type=parttype>
<xsl:call-template name=”parttypetemplate”/>
</xsl:if>
……
</xsl:for-each>
</xsl:template>
整個(gè)樣式表對(duì)應(yīng)試卷的 XML 結(jié)構(gòu)分為三個(gè)層次,最外層 為一個(gè)模板,匹配整個(gè) XML 文檔,內(nèi)層每個(gè) part 對(duì)應(yīng)一個(gè)模 板。同時(shí) part 內(nèi)又包含幾個(gè) section,每個(gè) section 又對(duì)應(yīng)一個(gè) 模板,part 的模板基本結(jié)構(gòu)如下:
<xsl:template name="parttypetemplate ">
<xsl:for-each select="./section">
<xsl:if test="./@type='sectiontype'">
<xsl:call-template name=”sectiontypetemplate”/>
</xsl:if>
……
</xsl:for-each>
</xsl:template>
Section 層次對(duì)應(yīng)基本的題型,所以這種結(jié)構(gòu)可以保證如 果出現(xiàn)新的題型,添加一個(gè)新的 section 模板就可以了。
三 利用 JavaScript 和 Ajax 改進(jìn)交互性和功能
1 part 與 section 的可折疊。
一般來說試卷的內(nèi)容會(huì)很多,如果不分頁(yè),將導(dǎo)致一頁(yè)過長(zhǎng)。如果我們可以按照 part, section 的分層將內(nèi)容進(jìn)行區(qū) 域折疊,用戶可以方便的折疊起不相關(guān)的內(nèi)容,從而很容易 找到需要的內(nèi)容。這個(gè)功能主要用到 CSS 的 display 屬性,當(dāng) display 屬性設(shè)置為 none 時(shí),頁(yè)面元素被從頁(yè)面流中移除,就 像這個(gè)元素不存在一樣。利用這個(gè)特性,我們?yōu)槊總€(gè) part 設(shè) 計(jì)對(duì)應(yīng)兩個(gè) div 元素。div1 用來顯示 part 標(biāo)題,div2 用來顯 示 part 的內(nèi)容,只需在樣式表中為 div1 的 onclick 事件賦如下 函數(shù)就可以實(shí)現(xiàn) part 內(nèi)容的折疊了(Section 的處理同 part):
Function toggle(sDivId){
Var oDiv=document.getElementById(sDivId);
oDiv.style.display=(oDiv.style.display==”none”) ? ”block”
: ”none”;}