摘 要:本文主要討論在基于XML的試題庫(kù)系統(tǒng)中,通過(guò)XSL轉(zhuǎn)換方便快速地輸出試卷的方法和實(shí)現(xiàn)過(guò)程。通過(guò)此方法,不僅可以很好地控制試卷的版面設(shè)計(jì),而且使程序、試卷數(shù)據(jù)和樣式分離,在輸出試卷時(shí)具有很大的靈活性,可以輸出多種格式的試卷。
關(guān)鍵詞:試卷 輸出 格式 XML XSL FOP
中圖分類號(hào):G434 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1673-8454(2007)10-0070-03
一、引言
隨著計(jì)算機(jī)技術(shù)在教學(xué)中的應(yīng)用越來(lái)越廣泛,試題庫(kù)系統(tǒng)的建設(shè)也越來(lái)越重要。在試題庫(kù)系統(tǒng)中,很重要的一個(gè)功能是試卷輸出。由于Office等軟件具備所見(jiàn)即所得、易于操作等特點(diǎn),許多試題庫(kù)系統(tǒng)基于這類軟件對(duì)試卷進(jìn)行版面設(shè)計(jì)及輸出。[1] 這種方式雖然易于實(shí)現(xiàn),但在使用時(shí)不能脫離軟件獨(dú)立運(yùn)行,在沒(méi)有安裝這類軟件的計(jì)算機(jī)上無(wú)法使用或是不能輸出試卷,而且輸出試卷的格式也受限于其依賴的編輯軟件。另一方面,隨著Internet的廣泛應(yīng)用,基于XML的網(wǎng)絡(luò)試題庫(kù)系統(tǒng)越來(lái)越多,這些系統(tǒng)更多地關(guān)注于試題的存儲(chǔ)與傳輸,對(duì)所生成試卷的輸出問(wèn)題很少提及。[2] 而在實(shí)際試題庫(kù)應(yīng)用中,對(duì)試卷輸出并打印是有很大需求的。
由此,我們?cè)谘邪l(fā)大學(xué)英語(yǔ)試題庫(kù)系統(tǒng)時(shí)對(duì)試卷輸出進(jìn)行了有益的嘗試,實(shí)現(xiàn)了基于XML的試題庫(kù)試卷的快速靈活的輸出。本文主要討論XML試題庫(kù)試卷的輸出過(guò)程及具體實(shí)現(xiàn)。
二、XML格式轉(zhuǎn)換的流程
由于XML格式不僅可擴(kuò)展性強(qiáng)、內(nèi)容與樣式分離、以文本格式進(jìn)行存儲(chǔ)和傳輸、具有良好的開(kāi)放性、跨平臺(tái)性和可操作性[3],而且與Word格式相比,采用XML格式來(lái)表示試卷、試題、參考答案文件有很多優(yōu)點(diǎn),更適合試題庫(kù)的網(wǎng)絡(luò)應(yīng)用的需求。[4] 所以我們采用XML作為試題庫(kù)系統(tǒng)中試題和試卷的存儲(chǔ)格式。這樣,試卷輸出的關(guān)鍵是將由XML表示的試卷文檔轉(zhuǎn)換成其他格式的文檔供修改或打印。其轉(zhuǎn)換過(guò)程如圖1所示:
圖1 XML格式轉(zhuǎn)換過(guò)程
XML源文檔以XML格式存儲(chǔ)了要轉(zhuǎn)換輸出的試卷內(nèi)容??蓴U(kuò)展標(biāo)記語(yǔ)言XML,可以使用自己創(chuàng)建的標(biāo)記存儲(chǔ)數(shù)據(jù)。在我們所開(kāi)發(fā)的試題庫(kù)系統(tǒng)中,試題和試卷都是基于XML存儲(chǔ)的,其中音頻和圖片也可以編碼后以XML格式存儲(chǔ)。[5]
XSL樣式表定義了輸出的版面設(shè)計(jì)和對(duì)輸出內(nèi)容的選取??蓴U(kuò)展樣式表語(yǔ)言XSL由XSLT、XPath和XSL-FO組成。[6] 可擴(kuò)展樣式表語(yǔ)言轉(zhuǎn)換XSLT提供一套規(guī)則,用于將一組元素描述的XML數(shù)據(jù)轉(zhuǎn)換為另一組元素描述的文檔,或者將該數(shù)據(jù)轉(zhuǎn)換為一種自定義的文本格式。在這里,我們通過(guò)XSLT,將用XML表示的試卷轉(zhuǎn)換為由XSL-FO表示的格式化對(duì)象。XPath是XML路徑語(yǔ)言,用于對(duì)XML文檔中的元素進(jìn)行定位,由XSLT使用。格式化對(duì)象的可擴(kuò)展樣式表語(yǔ)言XSL-FO定義了在屏幕或紙張或其他媒介上如何顯示數(shù)據(jù)。在我們的試題庫(kù)系統(tǒng)中,輸出的試卷排版布局由XSL-FO表示。
處理器讀取XML源文檔和XSL樣式表,并轉(zhuǎn)換輸出PDF、RTF、HTML等格式的文檔。在多種轉(zhuǎn)換處理工具中,我們選擇了FOP。FOP是Apache XML Project提供的一種轉(zhuǎn)換工具,使用它可以便捷地將XML文檔轉(zhuǎn)換為PDF、RTF等格式。[7] 但是由于FOP對(duì)于PDF和RTF的支持不完全相同,所在要針對(duì)PDF和RTF對(duì)樣式表分別作修改,才能輸出美觀的文檔。
由圖1可以看出,整個(gè)轉(zhuǎn)換過(guò)程就是將表示內(nèi)容的XML文檔和表示樣式的XSL文檔提交給處理器,經(jīng)處理器轉(zhuǎn)換得到輸出結(jié)果為PDF、RTF等格式的文檔。
三、基于XML的試卷輸出實(shí)現(xiàn)
在輸出試卷時(shí),我們首先將試題庫(kù)組卷模塊中生成的試卷保存為XML文檔,然后根據(jù)要輸出的試卷格式選擇相應(yīng)的樣式表,把XML文檔和樣式表交給處理程序FOP處理后將試卷輸出為PDF或RTF格式。本節(jié)先介紹我們采用的試卷結(jié)構(gòu),然后介紹對(duì)應(yīng)的樣式表,最后就實(shí)現(xiàn)過(guò)程中遇到的問(wèn)題給出解決方案。
1.試卷結(jié)構(gòu)
在本試題庫(kù)系統(tǒng)中,試題和試卷都存儲(chǔ)為XML結(jié)構(gòu)。通過(guò)擴(kuò)展XML標(biāo)記,定義了適合本題庫(kù)系統(tǒng)的試題和試卷XML結(jié)構(gòu)。試卷的具體結(jié)構(gòu)為:
<paper name="Test Paper" score="100">
<part type="Listening" id="1">
<section direction="Section Direction" type="Statements" id="1">
<assessmentItem id="1">
……
</assessmentItem>
<assessmentItem id="2">
……
</assessmentItem>
</section>
<section direction="Section Direction" type="Short Conversations" id="2">
<assessmentItem type="SentenceListening" id="1" />
……
</section>
<part type="Reading Comprehension" id="2">
……
</part>
……
</paper>
試卷(Paper)由幾個(gè)部分(Part)組成,每個(gè)部分由一節(jié)或幾節(jié)(Section)組成,每一節(jié)由若干試題(Item)組成。對(duì)于試題,由于題型的不同,包含不同的元素?;镜脑囶}結(jié)構(gòu)為:
<assessmentItem type="ReadingChoice" id="2">
<content >
<question id="36">
<prompt>The passage is meant to ______.</prompt>
<choices>
<choice id="A" />
<choice id="B" />
<choice id="C" />
<choice id="D" />
</choices>
<answer><value>A</value></answer>
</question>
<question id="37">
</question>
</assessmentItem>
試題的主要元素有題干、問(wèn)題、答案。對(duì)于聽(tīng)力題,需要有聲音文件和聽(tīng)力腳本。
2.樣式表
與試卷對(duì)應(yīng)的XSLT樣式表結(jié)構(gòu)為:
<xsl:stylesheet>
<xsl:template match="/">
<fo:root >
<fo:layout-master-set>
<fo:simple-page-master master-name="TestBanks">
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="TestBanks">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<xsl:call-template name="paper_test"/>
</fo:block>
<fo:block>
<xsl:call-template name="paper_answersheet"/>
</fo:block>
<fo:block>
<xsl:call-template name="paper_key"/>
</fo:block>
<fo:block>
<xsl:call-template name="paper_Script_of_Listening"/>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
在試卷的XML文檔中,題目?jī)?nèi)容、答案以及聽(tīng)力原文是在一起的,但在輸出的試卷中,要將其分成三個(gè)不同的部分,而且試卷輸出的同時(shí)要輸出答題紙,所以要對(duì)輸入的XML試卷進(jìn)行四遍掃描,每一遍分別應(yīng)用不同的模板,取出所需要處理的信息進(jìn)行轉(zhuǎn)換輸出。
試題冊(cè)模板首先輸出試卷名稱和注意事項(xiàng)等內(nèi)容,然后遍歷試卷中的每一部分節(jié)點(diǎn),根據(jù)每部分的名稱來(lái)應(yīng)用對(duì)應(yīng)的部分模板。每部分的模板先輸出標(biāo)題,然后遍歷本部分中的所有節(jié),對(duì)不同的節(jié)應(yīng)用對(duì)應(yīng)的節(jié)模板。節(jié)模板先輸出節(jié)標(biāo)題和本節(jié)的答題要求,然后遍歷本節(jié)的所有試題,應(yīng)用對(duì)應(yīng)的試題模板對(duì)試題內(nèi)容進(jìn)行輸出。對(duì)于不同的試題,根據(jù)其所具有的元素,選擇要在試題冊(cè)上顯示的內(nèi)容輸出。
答題卡模板、答案模板和聽(tīng)力腳本模板同樣采用上面按層次調(diào)用的方法,逐步應(yīng)用部分、節(jié)和試題模板,輸出自己所需要呈現(xiàn)的內(nèi)容。所有的內(nèi)容都輸出到fo:block內(nèi)容塊中。
3.轉(zhuǎn)換過(guò)程中遇到的問(wèn)題及解決辦法
設(shè)計(jì)好樣式表以后,就可以使用FOP對(duì)XML試卷進(jìn)行轉(zhuǎn)換輸出了。在輸出過(guò)程中,筆者在字體、試卷中的特殊格式等方面遇到以下主要問(wèn)題需要解決。
(1)字體設(shè)置
由于試卷上大部分內(nèi)容是英文,需要用英文字體來(lái)顯示,但是也會(huì)出現(xiàn)一些漢字,需要用漢字字體來(lái)顯示,而由于FOP的PDF輸出不支持多字體,所以采用英文字體輸出后應(yīng)該是漢字的內(nèi)容就成了“#”號(hào)。為了解決這一問(wèn)題,需要自定義字體。我們制作了新的字體文件TestBank,將英文字體和漢字字體組合在一起形成一種新的字體。制作好字體文件后,還要生成字體映射文件TestBank.xml,并在FOP的配置文件中進(jìn)行注冊(cè)。這樣,在樣式表中設(shè)置字體為我們新建的字體就可以同時(shí)處理英文與漢字,滿足了本試題庫(kù)系統(tǒng)中對(duì)輸出試卷的字體的要求。
(2)下劃線等特殊格式的處理
試題內(nèi)容中包含有許多特殊格式,如斜體和下劃線等,需要在輸出時(shí)做特殊處理。這就需要用到fo:block塊中的fo:inline內(nèi)聯(lián)元素。通過(guò)XSLT對(duì)嵌套有斜體和下劃線的內(nèi)容作遞歸處理,把其中有特殊格式的部分放入內(nèi)聯(lián)元素中,并設(shè)置內(nèi)聯(lián)元素的font-style=“italic”和text-decoration=“underline”屬性后,可以把內(nèi)容按要求的格式輸出。對(duì)于加下劃線的內(nèi)容,為了顯示更加清晰,最好在加下劃線的內(nèi)容前后各加一個(gè)空格,但是由于在處理過(guò)程中不支持對(duì)空白字符加下劃線,所以需要找一個(gè)不可打印的非空白字符來(lái)代替空格。在這里可以采用插入轉(zhuǎn)義字符的方式實(shí)現(xiàn),通過(guò)嘗試“cedil;”、“#323;”和“”后,發(fā)現(xiàn)“”無(wú)論對(duì)于PDF還是RTF都可以滿足要求,在有下劃線的內(nèi)容時(shí)顯示不僅清楚而且美觀。
(3)選項(xiàng)的排列
如何合理排列選項(xiàng)是試卷輸出中的一個(gè)重要問(wèn)題。我們的選項(xiàng)排列方式有每行四個(gè)、每行兩個(gè)和每行一個(gè)三種。對(duì)于長(zhǎng)度較大的選項(xiàng)直接采用每行一個(gè)選項(xiàng)的方式輸出;而對(duì)于長(zhǎng)度變化可能較大的選項(xiàng)則根據(jù)選項(xiàng)的長(zhǎng)度動(dòng)態(tài)選擇按每行四個(gè)或兩個(gè)選項(xiàng)的方式來(lái)進(jìn)行排列。在輸出選項(xiàng)上,我們采用了XSL-FO中的表格元素fo:table,在計(jì)算出四個(gè)選項(xiàng)中最長(zhǎng)的一個(gè)選項(xiàng)的長(zhǎng)度后,根據(jù)我們的頁(yè)面設(shè)置判斷是否可在一行內(nèi)顯示完全,如果可以,就按每行四個(gè)選項(xiàng)設(shè)置選項(xiàng)表格的單元格寬度;否則,按每行兩個(gè)選項(xiàng)來(lái)設(shè)置表格的單元格寬度。這樣把選項(xiàng)輸出到表格中,就很好地解決了選項(xiàng)排列輸出的問(wèn)題。
(4)圖片、聲音等特殊數(shù)據(jù)的處理
試卷中還有另外一類特殊數(shù)據(jù),即非文字信息,主要包括圖片和聲音。它們也可以經(jīng)過(guò)編碼后存儲(chǔ)在試卷XML文檔中。在輸出試卷之前,可先由程序?qū)ML文檔中的圖片和聲音數(shù)據(jù)解碼并保存為磁盤文件,然后在輸出時(shí)進(jìn)行處理。其中圖片要輸出到試卷中,所以要在樣式轉(zhuǎn)換時(shí)通過(guò)XSLT和XSL-FO來(lái)進(jìn)行處理,在試題的輸出塊中應(yīng)插入圖片的地方,嵌入
四、總結(jié)
通過(guò)XSL轉(zhuǎn)換實(shí)現(xiàn)XML試卷輸出可以輸出多種格式的文檔,也能很好地進(jìn)行試卷版面設(shè)計(jì),并且將試卷的輸出樣式與程序和試卷內(nèi)容本身分離開(kāi)來(lái),具有很大的靈活性。同時(shí),試卷輸出時(shí)不需要Office等排版工具的支持,這對(duì)于通常不安裝此類軟件的服務(wù)器端來(lái)說(shuō)是非常方便的,所以這種方法使基于B/S的網(wǎng)絡(luò)試題庫(kù)系統(tǒng)能夠更加方便地實(shí)現(xiàn)試卷輸出。隨著Office等軟件逐漸加強(qiáng)對(duì)XML格式的支持,也可以由XML直接轉(zhuǎn)換成Office等軟件的XML格式,如WordML,ExcelML等。總之,基于XML進(jìn)行格式轉(zhuǎn)換是一種靈活方便的試題庫(kù)系統(tǒng)試卷輸出方案。
參考文獻(xiàn):
[1]鐘名春,廖赤球.試題庫(kù)成卷版面設(shè)計(jì)技術(shù)[J].廣州:機(jī)電工程技術(shù),2002,31(6):97-99.
[2]楊瑩,呂津,劉光昌.基于XML 的網(wǎng)絡(luò)題庫(kù)的實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2004,25(8):1356-1358.
[3]何昭青.基于XML 的分布式試題庫(kù)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].吉首大學(xué)學(xué)報(bào)(自然科學(xué)版),2004,25(1):52-55.
[4]丁揚(yáng). XML技術(shù)在試題庫(kù)改造中的應(yīng)用[D].華南理工大學(xué), 2003
[5]W3C. Extensible Markup Language(XML) http://www.w3.org/XML/,2006/09/11
[6]W3C. The Extensible Stylesheet Language Family(XSL) http://www.w3.org/Style/XSL/,2007/02/05
[7]Apache Software Foundation. Formatting Objects Processor(FOP) http://xmlgraphics.apache.org/fop/,2007/01/22