專利名稱:用于結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)換的設(shè)備的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及處理和轉(zhuǎn)換諸如可擴(kuò)展標(biāo)記語(yǔ)言(XML)、標(biāo)準(zhǔn)化通用標(biāo)記語(yǔ)言(SGML)、超文本標(biāo)記語(yǔ)言(HTML)之類的結(jié)構(gòu)化文檔,以及數(shù)據(jù)庫(kù)和/或文件系統(tǒng)中的非結(jié)構(gòu)化數(shù)據(jù)和文檔的領(lǐng)域。
背景技術(shù):
隨著計(jì)算機(jī)和計(jì)算機(jī)存儲(chǔ)器變得無(wú)所不在,各種組織維護(hù)的信息量顯著地增大。信息常常以許多不同的格式存儲(chǔ),如字處理器文檔、電子表格文件、數(shù)據(jù)庫(kù)、可移植文檔格式(PDF)文檔、圖像化文檔(例如,掃描為各種圖形顯示格式)、純文本等等。此外,文檔可以以諸如SGML、HTML、XML等等之類的標(biāo)記語(yǔ)言格式進(jìn)行存儲(chǔ)。
使信息具有如此多的不同格式使得在組織內(nèi)以及在組織外部共享信息復(fù)雜化。近來(lái),XML已經(jīng)作為用于描述文檔中的內(nèi)容并向非結(jié)構(gòu)化數(shù)據(jù)和/或文檔提供結(jié)構(gòu)的標(biāo)準(zhǔn)。XML提供了靈活而可擴(kuò)展的機(jī)制,用于為文檔定義標(biāo)記,允許為所描述的信息自定義標(biāo)記。
作為處理XML的裝置實(shí)現(xiàn)的一種機(jī)制是可擴(kuò)展的樣式表語(yǔ)言(XSL)和使用XSL編寫(xiě)的樣式表??梢跃帉?xiě)樣式表,以將XML文檔從在XML內(nèi)定義的一種標(biāo)記定義(或“詞匯表”)轉(zhuǎn)換為另一種詞匯表,從XML標(biāo)記轉(zhuǎn)換為另一種結(jié)構(gòu)化或非結(jié)構(gòu)化文檔格式(如純文本、字處理器、電子表格、數(shù)據(jù)庫(kù)、PDF、HTML等等),或從另一種結(jié)構(gòu)化或非結(jié)構(gòu)化文檔格式轉(zhuǎn)換為XML標(biāo)記。如此,樣式表可以用來(lái)通過(guò)將文檔的結(jié)構(gòu)從其存儲(chǔ)的格式轉(zhuǎn)換為給定用戶預(yù)期的格式來(lái)簡(jiǎn)化對(duì)組織的信息的訪問(wèn)(以其許多不同的格式)。還有其他樣式表類型(例如,作為對(duì)HTML的擴(kuò)展定義的級(jí)聯(lián)樣式表或CSS)。
通常,以在通用計(jì)算機(jī)(例如,對(duì)文檔存儲(chǔ)進(jìn)行管理的服務(wù)器,用戶計(jì)算機(jī)等等)上執(zhí)行的軟件執(zhí)行文檔轉(zhuǎn)換處理。在訪問(wèn)這樣的文檔時(shí)會(huì)遇到嚴(yán)重的延遲。
發(fā)明內(nèi)容
在一個(gè)實(shí)施例中,一種裝置包括分析電路和表達(dá)式處理器。連接為接收文檔的分析電路被配置為對(duì)文檔進(jìn)行分析,并生成對(duì)應(yīng)于分析的事件。用于從分析電路接收事件的表達(dá)處理器被配置為將由事件所標(biāo)識(shí)的節(jié)點(diǎn)應(yīng)用于從樣式表中的多個(gè)表達(dá)式派生出來(lái)的一個(gè)或多個(gè)表達(dá)式樹(shù)。表達(dá)式處理器標(biāo)識(shí)滿足在一個(gè)或多個(gè)表達(dá)式樹(shù)中表示的表達(dá)式的節(jié)點(diǎn),作為將節(jié)點(diǎn)應(yīng)用于一個(gè)或多個(gè)表達(dá)式樹(shù)的結(jié)果。
在另一個(gè)實(shí)施例中,設(shè)想了一種方法。樣式表中的每一個(gè)表達(dá)式被特征化為,將樣式表應(yīng)用于文檔轉(zhuǎn)換裝置中的文檔的多個(gè)階段的某一個(gè)階段是可求值的。在特征化時(shí)確定的多個(gè)階段中的某一個(gè)階段,每一個(gè)表達(dá)式被應(yīng)用于文檔。
下面的詳細(xì)描述參考了簡(jiǎn)要描述的附圖。
圖1是內(nèi)容轉(zhuǎn)換設(shè)備的一個(gè)實(shí)施例的方框圖。
圖2是圖1所示的文檔處理器的一個(gè)實(shí)施例的方框圖。
圖3是圖2所示的文檔處理器和圖1所示的處理器的一部分的一個(gè)實(shí)施例的方框圖,說(shuō)明了它們之間的通信和對(duì)它們的輸入。
圖4是說(shuō)明了樣式表編譯和表達(dá)式求值的方法的一個(gè)實(shí)施例的流程圖。
圖5是說(shuō)明了樣式表編譯器的一個(gè)實(shí)施例的操作的流程圖。
圖6是說(shuō)明了架構(gòu)編譯器的一個(gè)實(shí)施例的操作的流程圖。
圖7是說(shuō)明了圖2和3所示的分析器的一個(gè)實(shí)施例的輸入數(shù)據(jù)結(jié)構(gòu)和輸出數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例的方框圖。
圖8是說(shuō)明了圖7所示的用于向節(jié)點(diǎn)標(biāo)識(shí)符分配序列號(hào)的分析器的一個(gè)實(shí)施例的操作的流程圖。
圖9是說(shuō)明了圖2和3所示的表達(dá)式處理器的一個(gè)實(shí)施例的輸入數(shù)據(jù)結(jié)構(gòu)和輸出數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例的方框圖。
圖10是圖2和9所顯示的分析時(shí)表達(dá)式樹(shù)的一個(gè)實(shí)施例的方框圖。
圖11是表達(dá)式樹(shù)的一部分和對(duì)應(yīng)于此的分析時(shí)表達(dá)式樹(shù)條目的示例。
圖12A-12B是說(shuō)明了響應(yīng)元素開(kāi)始事件的表達(dá)式處理器的一個(gè)實(shí)施例的操作的流程圖。
圖13是說(shuō)明了響應(yīng)元素結(jié)束事件的表達(dá)式處理器的一個(gè)實(shí)施例的操作的流程圖。
圖14A-14B是說(shuō)明了響應(yīng)屬性名稱事件的表達(dá)式處理器的一個(gè)實(shí)施例的操作的流程圖。
圖15是說(shuō)明了響應(yīng)元素關(guān)閉事件的表達(dá)式處理器的一個(gè)實(shí)施例的操作的流程圖。
圖16是說(shuō)明了轉(zhuǎn)換引擎的一個(gè)實(shí)施例的操作的流程圖。
圖17是圖2和9所顯示的分析時(shí)表達(dá)式樹(shù)的另一個(gè)實(shí)施例的方框圖。
圖18是說(shuō)明圖17所示的某些字段的示范性編碼的一組表。
圖19A-19B是說(shuō)明了響應(yīng)元素開(kāi)始事件的表達(dá)式處理器的一個(gè)實(shí)施例的操作的流程圖。
圖20是說(shuō)明了響應(yīng)元素結(jié)束事件的表達(dá)式處理器的一個(gè)實(shí)施例的操作的流程圖。
圖21A-21B是說(shuō)明了響應(yīng)屬性名稱事件的表達(dá)式處理器的一個(gè)實(shí)施例的操作的流程圖。
圖22A-22B是說(shuō)明了響應(yīng)文本事件的表達(dá)式處理器的一個(gè)實(shí)施例的操作的流程圖。
圖23A-23B是說(shuō)明了響應(yīng)注釋事件的表達(dá)式處理器的一個(gè)實(shí)施例的操作的流程圖。
圖24A-24B是說(shuō)明了響應(yīng)處理指令事件的表達(dá)式處理器的一個(gè)實(shí)施例的操作的流程圖。
盡管本發(fā)明可進(jìn)行各種修改,并且還可采用其他的形式,但是,本發(fā)明的各具體實(shí)施例均以結(jié)合附圖的舉例的方式說(shuō)明,并將在以下的說(shuō)明書(shū)中進(jìn)行詳細(xì)描述。然而,應(yīng)該理解,圖形和詳細(xì)描述不將本發(fā)明限制于所說(shuō)明的特定形式,相反,本發(fā)明涵蓋不偏離所附的權(quán)利要求所定義的本發(fā)明的精神和范圍的所有修改方案、等效內(nèi)容和替代方案。
具體實(shí)施例方式
現(xiàn)在請(qǐng)參看圖1,該圖顯示了內(nèi)容轉(zhuǎn)換設(shè)備10的一個(gè)實(shí)施例的方框圖。在圖1的實(shí)施例中,內(nèi)容轉(zhuǎn)換設(shè)備10可以包括網(wǎng)絡(luò)接口電路12,諸如處理器14A和14B(可選)之類的一個(gè)或多個(gè)處理器,文檔處理器16以及存儲(chǔ)器18。網(wǎng)絡(luò)接口電路12通過(guò)一個(gè)或多個(gè)網(wǎng)絡(luò)連接而連接到一個(gè)或多個(gè)網(wǎng)絡(luò)。各種計(jì)算機(jī)系統(tǒng)(圖1中未顯示)也可以連接到一個(gè)或多個(gè)網(wǎng)絡(luò)。網(wǎng)絡(luò)接口電路12也連接到處理器14A-14B。處理器連接到存儲(chǔ)器18和文檔處理器16,而文檔處理器16還連接到存儲(chǔ)器18。在所說(shuō)明的實(shí)施例中,存儲(chǔ)器18存儲(chǔ)了樣式表編譯器20、架構(gòu)編譯器22、一個(gè)或多個(gè)符號(hào)表24、一個(gè)或多個(gè)分析時(shí)表達(dá)式樹(shù)26、指令表30、空格表32、文檔類型定義(DTD)表34、表達(dá)式列表36、模板列表38,以及各種文檔處理器數(shù)據(jù)結(jié)構(gòu)39。
內(nèi)容轉(zhuǎn)換設(shè)備10可以通過(guò)網(wǎng)絡(luò)連接接收待應(yīng)用于文檔的樣式表、待應(yīng)用于文檔的架構(gòu),和/或文檔本身(帶有將樣式表/架構(gòu)應(yīng)用到文檔的請(qǐng)求)。響應(yīng)應(yīng)用樣式表的請(qǐng)求,內(nèi)容轉(zhuǎn)換設(shè)備10可以將樣式表應(yīng)用到文檔,并生成待通過(guò)網(wǎng)絡(luò)傳輸?shù)秸?qǐng)求者的轉(zhuǎn)換的文檔。在一些實(shí)施例中,內(nèi)容轉(zhuǎn)換設(shè)備10還可以接收對(duì)文檔進(jìn)行分析的請(qǐng)求(例如,分析為諸如針對(duì)XML的簡(jiǎn)單應(yīng)用程序編程接口(API)(SAX)或文檔對(duì)象模型(DOM)之類的已定義的格式)。響應(yīng)應(yīng)用架構(gòu)(或DTD)的請(qǐng)求,內(nèi)容轉(zhuǎn)換設(shè)備10可以根據(jù)架構(gòu)或DTD對(duì)文檔進(jìn)行驗(yàn)證,并對(duì)請(qǐng)求者生成成功消息或失敗消息(指出失敗)。
在一些實(shí)施例中,內(nèi)容轉(zhuǎn)換設(shè)備10可以接收用于對(duì)XML數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn)的XPath表達(dá)式。在這樣的實(shí)施例中,可以類似于樣式表對(duì)表達(dá)式進(jìn)行編譯(下面將比較詳細(xì)地描述),并可以以類似于將樣式表應(yīng)用于文檔的方式應(yīng)用于XML數(shù)據(jù)庫(kù)。
一般而言,XML文檔具有分層樹(shù)形結(jié)構(gòu),其中,樹(shù)的根將文檔標(biāo)識(shí)為一個(gè)整體,文檔中的每個(gè)其它節(jié)點(diǎn)是根的后代。各種元素、屬性以及文檔內(nèi)容構(gòu)成了樹(shù)的節(jié)點(diǎn)。元素定義了元素所包含的內(nèi)容的結(jié)構(gòu)。每一個(gè)元素都具有元素名稱,元素使用開(kāi)始標(biāo)記和結(jié)束標(biāo)記(兩者都包括了元素名稱)將內(nèi)容分隔開(kāi)。一個(gè)元素還可以具有其他元素作為子元素,子元素可以進(jìn)一步定義內(nèi)容的結(jié)構(gòu)。此外,元素還可以包括屬性(包括在開(kāi)始標(biāo)記中,跟在元素名稱后),它們是提供關(guān)于元素或元素內(nèi)容的結(jié)構(gòu)的詳細(xì)信息的名稱/值對(duì)。XML文檔還可以包括將被傳遞到應(yīng)用程序的讀取XML文檔、注釋等的處理指令。如這里所使用的,術(shù)語(yǔ)“文檔”是指具有可用于對(duì)內(nèi)容進(jìn)行解釋的對(duì)應(yīng)的已定義的結(jié)構(gòu)的任何內(nèi)容。內(nèi)容可以被高度結(jié)構(gòu)化(如XML文檔、HTML文檔、pdf文檔、字處理文檔、數(shù)據(jù)庫(kù)等等),也可以如純文本文檔(其結(jié)構(gòu)可以是字符流)那樣簡(jiǎn)單。一般而言,文檔的“節(jié)點(diǎn)”可以包括結(jié)構(gòu)性定義(例如,XML中的元素和/或?qū)傩?和/或文檔內(nèi)容。在一個(gè)特定實(shí)施例中,節(jié)點(diǎn)可以包括元素、屬性、處理指令、注釋和文本。
XSLT樣式表可以被視為一組模板。每一個(gè)模板都可以包括(i)選擇源文檔的樹(shù)形結(jié)構(gòu)中的節(jié)點(diǎn)的表達(dá)式;以及(ii)為源文檔的每一個(gè)匹配節(jié)點(diǎn)指定待實(shí)例化的輸出文檔的結(jié)構(gòu)的對(duì)應(yīng)的部分的正文。將樣式表應(yīng)用到源文檔的操作可以包括試圖查找源文檔中的每一個(gè)節(jié)點(diǎn)的匹配模板,實(shí)例化輸出文檔的樹(shù)中的匹配模板的正文。模板的正文可以包括以下內(nèi)容的一個(gè)或多個(gè)(i)輸出文檔中的待實(shí)例化的文本內(nèi)容;(ii)從匹配節(jié)點(diǎn)中選擇待復(fù)制到輸出文檔中的內(nèi)容;以及(iii)待求值的語(yǔ)句,在輸出文檔中語(yǔ)句被實(shí)例化的結(jié)果。概括起來(lái),待實(shí)例化的內(nèi)容和待求值的語(yǔ)句可以被稱為要在與模板匹配的節(jié)點(diǎn)上執(zhí)行的“操作”。模板的正文可以包括一個(gè)或多個(gè)“apply templates”語(yǔ)句,其中,包括選擇一個(gè)或多個(gè)節(jié)點(diǎn)并使樣式表中的模板應(yīng)用于所選擇的節(jié)點(diǎn)的表達(dá)式,如此有效地將模板嵌套起來(lái)。如果查找到與應(yīng)用模板語(yǔ)句的匹配,則所產(chǎn)生的模板在包括應(yīng)用模板語(yǔ)句的模板的實(shí)例化內(nèi)被實(shí)例化。模板的正文中的其他語(yǔ)句還可以包括待與節(jié)點(diǎn)進(jìn)行匹配的表達(dá)式(并可以在匹配節(jié)點(diǎn)中對(duì)語(yǔ)句進(jìn)行求值)。盡管這里在一個(gè)示例中可以使用XSLT樣式表,但是,一般而言,“樣式表”可以包括用于將源文檔轉(zhuǎn)換為輸出文檔的任何規(guī)范。源文檔和輸出文檔可以采用相同語(yǔ)言(例如,源文檔和輸出文檔可以是不同的XML詞匯表),也可以采用不同語(yǔ)言(例如,XML到PDF等等)。樣式表的另一個(gè)示例可以是為HTML和/或XML Query定義的級(jí)聯(lián)樣式表。
一般而言,在樣式表中所使用的表達(dá)式可以包括節(jié)點(diǎn)標(biāo)識(shí)符和/或節(jié)點(diǎn)的值,以及節(jié)點(diǎn)標(biāo)識(shí)符上的指定節(jié)點(diǎn)標(biāo)識(shí)符和/或值之間的父/子(或祖先/后代)關(guān)系的操作符。節(jié)點(diǎn)標(biāo)識(shí)符可以包括名稱(例如,元素名稱、屬性名稱等等),也可以包括按類型標(biāo)識(shí)節(jié)點(diǎn)的表達(dá)式構(gòu)造,(例如,節(jié)點(diǎn)測(cè)試表達(dá)式可以與任何節(jié)點(diǎn)匹配,或者,文本測(cè)試表達(dá)式可以與任何文本節(jié)點(diǎn)匹配)。在某些情況下,名稱可以屬于具體的命名空間。在這樣的情況下,節(jié)點(diǎn)標(biāo)識(shí)符可以是與命名空間關(guān)聯(lián)的名稱。在XML中,命名空間提供了通過(guò)將元素和屬性名稱與由通用資源標(biāo)識(shí)符(URI)所標(biāo)識(shí)的命名空間名稱關(guān)聯(lián)來(lái)限定元素和屬性名稱的方法。如此,節(jié)點(diǎn)標(biāo)識(shí)符可以是限定名(可選的命名空間前綴,后面是冒號(hào),再后面是名稱)。如這里所使用的名稱(例如,元素名稱,屬性名稱等等)可以包括限定名。表達(dá)式還可以包括謂詞,該謂詞可以是用于與節(jié)點(diǎn)進(jìn)行匹配的額外的條件。謂詞是用關(guān)聯(lián)的節(jié)點(diǎn)作為上下文節(jié)點(diǎn)(下面定義)進(jìn)行求值的表達(dá)式,其中,表達(dá)式的結(jié)果為true(節(jié)點(diǎn)可以與表達(dá)式節(jié)點(diǎn)匹配)或者false(節(jié)點(diǎn)不與表達(dá)式匹配)。如此,表達(dá)式可以被視為待與文檔的樹(shù)進(jìn)行匹配的節(jié)點(diǎn)的樹(shù)。在XPath中,在XSLT中所使用的表達(dá)式語(yǔ)言可以在“contextnode”的上下文中對(duì)表達(dá)式進(jìn)行求值(即,表達(dá)式可以相對(duì)于上下文節(jié)點(diǎn),指定表達(dá)式中的節(jié)點(diǎn)標(biāo)識(shí)符作為上下文節(jié)點(diǎn)的祖先、后代、父母或子女以及與其他節(jié)點(diǎn)標(biāo)識(shí)符的關(guān)系)。如果通過(guò)對(duì)表達(dá)式的求值選擇給定文檔節(jié)點(diǎn),則該給定文檔節(jié)點(diǎn)可以滿足表達(dá)式。即,表達(dá)式中的表達(dá)式節(jié)點(diǎn)標(biāo)識(shí)符匹配了給定文檔節(jié)點(diǎn)的名稱或與表達(dá)式中所指定的給定文檔節(jié)點(diǎn)具有相同關(guān)系的文檔節(jié)點(diǎn)名稱,在表達(dá)式中所使用的任何值都等于與給定文檔節(jié)點(diǎn)相關(guān)的對(duì)應(yīng)值。如果一個(gè)文檔節(jié)點(diǎn)滿足給定表達(dá)式,則該文檔節(jié)點(diǎn)也可以被稱為給定表達(dá)式的“匹配節(jié)點(diǎn)”。在某些情況下,在本討論的其余部分,區(qū)別表達(dá)式樹(shù)中的節(jié)點(diǎn)與文檔中的節(jié)點(diǎn)是有幫助的。如此,如果一個(gè)節(jié)點(diǎn)是表達(dá)式樹(shù)的一部分,則該節(jié)點(diǎn)可以被稱為“表達(dá)式節(jié)點(diǎn)”,如果一個(gè)節(jié)點(diǎn)是正在處理的文檔的一部分,則該節(jié)點(diǎn)可以被稱為“文檔節(jié)點(diǎn)”。
在所說(shuō)明的實(shí)施例中,可以以如下方式執(zhí)行將樣式表應(yīng)用到文檔的操作。樣式表編譯器20可以包括在處理器14A-14B中的某一個(gè)處理器上執(zhí)行的軟件(即,多個(gè)指令),以將樣式表編譯為供文檔處理器16使用的一個(gè)或多個(gè)數(shù)據(jù)結(jié)構(gòu)和代碼。文檔處理器16可以將數(shù)據(jù)結(jié)構(gòu)應(yīng)用于源文檔并生成輸出文檔。
具體來(lái)說(shuō),在一個(gè)實(shí)施例中,樣式表編譯器20可以向節(jié)點(diǎn)標(biāo)識(shí)符分配序列號(hào),以便可以由文檔處理器通過(guò)比較數(shù)字,而不是節(jié)點(diǎn)標(biāo)識(shí)符(將涉及字符串比較)來(lái)執(zhí)行表達(dá)式求值。樣式表編譯器20可以將節(jié)點(diǎn)標(biāo)識(shí)符與序列號(hào)的映射存儲(chǔ)在符號(hào)表24中。此外,樣式表編譯器20還可以從樣式表中提取表達(dá)式,并生成表達(dá)式樹(shù)數(shù)據(jù)結(jié)構(gòu),供文檔處理器用于進(jìn)行表達(dá)式匹配(例如,分析時(shí)表達(dá)式樹(shù)26)。更進(jìn)一步,樣式表編譯器20還可以用為每一個(gè)匹配表達(dá)式執(zhí)行的指令生成指令表30(在一個(gè)實(shí)施例中,也可以是待執(zhí)行以對(duì)運(yùn)行時(shí)謂詞進(jìn)行求值的指令)。指令表中的指令,當(dāng)由文檔處理器16執(zhí)行時(shí),可以導(dǎo)致執(zhí)行被定義為當(dāng)匹配表達(dá)式時(shí)執(zhí)行的操作。在一些實(shí)施例中,指令可以包括待執(zhí)行的操作(即,在指令和操作之間可以有一對(duì)一的對(duì)應(yīng)關(guān)系)。在其他實(shí)施例中,至少一些操作可以通過(guò)執(zhí)行兩個(gè)或更多指令來(lái)實(shí)現(xiàn)。樣式表編譯器20還可以生成定義如何處理(例如,保留、剝離等等)源文檔中的各種空格的空格表32,表達(dá)式列表36和模板列表38。
架構(gòu)編譯器22可以類似地包括在處理器14A-14B中的某一個(gè)處理器中執(zhí)行的指令。架構(gòu)編譯器22可以編譯架構(gòu)或DTD以生成一個(gè)或多個(gè)符號(hào)表24(用序列號(hào)代替節(jié)點(diǎn)標(biāo)識(shí)符)以及DTD表34。一般而言,DTD或架構(gòu)可以包括允許的文檔結(jié)構(gòu)和必需的文檔結(jié)構(gòu)兩種結(jié)構(gòu)的定義。如此,文檔的作者可以用DTD和/或架構(gòu)來(lái)描述有效文檔的必需的和允許的結(jié)構(gòu)。在某些情況下,DTD或架構(gòu)還可以包括屬性的默認(rèn)值。在一個(gè)實(shí)施例中,DTD/架構(gòu)可以包括各種信息用于代替文檔中的實(shí)體引用的實(shí)體聲明,給定元素的對(duì)于有效文檔是必需的屬性的屬性,可以不必在文檔的給定元素中指定的屬性的屬性默認(rèn)值,文檔的結(jié)構(gòu)的要求(例如,某一子元素的必需的最小/最大/具體數(shù)量等等),以及文檔的允許的結(jié)構(gòu)的定義。DTD表34可以包括實(shí)體引用替換的表,必需的屬性的表,屬性默認(rèn)值的表,以及標(biāo)識(shí)允許的結(jié)構(gòu)(如果適用的話,還有必需的結(jié)構(gòu))的骨架樹(shù)。
文檔處理器16可以包括用于對(duì)文檔進(jìn)行分析并將文檔節(jié)點(diǎn)與分析時(shí)表達(dá)式樹(shù)中的表達(dá)式節(jié)點(diǎn)進(jìn)行匹配的硬件電路。即,用于對(duì)文檔進(jìn)行分析并將文檔與表達(dá)式節(jié)點(diǎn)進(jìn)行匹配的硬件電路,可以執(zhí)行這些操作,而不執(zhí)行任何軟件指令。對(duì)于每一個(gè)表達(dá)式,硬件可以生成存儲(chǔ)了匹配文檔節(jié)點(diǎn)的分析的內(nèi)容和指示的各種數(shù)據(jù)結(jié)構(gòu)。然后,對(duì)于該給定表達(dá)式的每一個(gè)匹配文檔節(jié)點(diǎn)上的給定表達(dá)式,硬件可以執(zhí)行來(lái)自指令表30的指令,生成結(jié)果,然后,將這些結(jié)果組合起來(lái),以產(chǎn)生輸出文檔。下面提供了一個(gè)實(shí)施例的其他細(xì)節(jié)。
如上所述,在所說(shuō)明的實(shí)施例中,以軟件實(shí)現(xiàn)樣式表編譯器20和架構(gòu)編譯器22,以硬件實(shí)現(xiàn)文檔處理器16。在一些實(shí)施例中,當(dāng)發(fā)出轉(zhuǎn)換請(qǐng)求并提供文檔時(shí),內(nèi)容轉(zhuǎn)換設(shè)備10的性能中的關(guān)鍵因素可以是對(duì)文檔的處理。即,在很多情況下,與正在處理的文檔數(shù)量相比,樣式表和/或架構(gòu)可以相對(duì)不太頻繁地改變。在改變樣式表(改變?yōu)楦碌臉邮奖砘虿煌臉邮奖?之前,一個(gè)給定樣式表可以應(yīng)用于多個(gè)文檔(例如,至少大約數(shù)十個(gè)文檔)。對(duì)于架構(gòu)和將向其應(yīng)用架構(gòu)的文檔,類似的關(guān)系也成立。相應(yīng)地,從樣式表/架構(gòu)(使用軟件)將相對(duì)不變的信息捕獲到可以有效地通過(guò)專用的自定義硬件訪問(wèn)的數(shù)據(jù)結(jié)構(gòu)中,可以提供高性能的解決方案。此外,在一些實(shí)施例中,以硬件進(jìn)行樣式表/架構(gòu)編譯,可以提供實(shí)現(xiàn)不同的樣式表/架構(gòu)語(yǔ)言和/或?qū)崿F(xiàn)語(yǔ)言規(guī)范改變的靈活性,而不需要改變自定義硬件。例如,XSLT、XPath和XML架構(gòu)仍在發(fā)展,將來(lái)會(huì)向這些語(yǔ)言中添加新的功能??梢允咕幾g器處理這些新的功能??梢灶A(yù)先提供要使用的樣式表/架構(gòu),如此,編譯樣式表/架構(gòu)的時(shí)間可以不那么要求嚴(yán)格了。然而,在其他實(shí)施例中,樣式表編譯器20和架構(gòu)編譯器22中的某一種或兩者都可以以硬件來(lái)實(shí)現(xiàn),也可以以硬件和軟件的組合來(lái)實(shí)現(xiàn)。
網(wǎng)絡(luò)接口電路12可以處理網(wǎng)絡(luò)連接上的低級(jí)別的電子方面的和協(xié)議方面的細(xì)節(jié)內(nèi)容,并可以將接收到的數(shù)據(jù)包傳遞到處理器14A-14B進(jìn)行處理??梢允褂萌魏尉W(wǎng)絡(luò)類型。例如,在一些實(shí)施例中,網(wǎng)絡(luò)連接可以是千兆以太網(wǎng)連接??梢砸勒找筇峁┮粋€(gè)以上的連接,以達(dá)到給定的帶寬級(jí)別和/或在網(wǎng)絡(luò)連接中提供冗余。
處理器14A-14B可以包括任何處理器類型。例如,在一個(gè)實(shí)施例中,處理器14A-14B可以是PowerPC網(wǎng)絡(luò)處理器。在其他實(shí)施例中,處理器14A-14B可以實(shí)現(xiàn)其他指令集體系結(jié)構(gòu),如ARM、英特爾的IA-32,MIPS等等。
可以使用任何互連來(lái)將處理器14A-14B、文檔處理器16以及存儲(chǔ)器18連接起來(lái)。除了處理器14A-14B和文檔處理器16兩者與存儲(chǔ)器18建立的連接之外,處理器14A-14B還可以連接到文檔處理器16。例如,在一個(gè)實(shí)施例中,處理器14A-14B可以使用一個(gè)或多個(gè)外圍組件互連快速(PCI-X)總線連接到文檔處理器16。
值得注意的是,在某些情況下,DTD、架構(gòu)或樣式表可以嵌入在文檔中(要么直接要么作為指向架構(gòu)或樣式表的指針)。在這樣的情況下,可以從文檔提取DTD、架構(gòu)或樣式表,并按為單獨(dú)提供的架構(gòu)或樣式表描述的方式進(jìn)行處理。
存儲(chǔ)器18可以包括任何易失性或非易失性存儲(chǔ)器類型。例如,存儲(chǔ)器18可以包括一個(gè)或多個(gè)RAM(例如,SDRAM、RDRAM、SRAM等等),諸如閃速存儲(chǔ)器或電池供電的RAM之類的非易失性存儲(chǔ)器,諸如磁盤(pán)或CD-ROM之類的磁性或光存儲(chǔ)器等等。存儲(chǔ)器18可以包括可單獨(dú)地訪問(wèn)的多個(gè)存儲(chǔ)器(例如,只能讓處理器14A-14B訪問(wèn)的一個(gè)分區(qū)或多個(gè)分區(qū),以及只能讓文檔處理器16訪問(wèn)的另一個(gè)分區(qū)或多個(gè)分區(qū))。
圖1說(shuō)明了存儲(chǔ)在存儲(chǔ)器18中的樣式表編譯器20和架構(gòu)編譯器22。一般而言,樣式表編譯器20和/或架構(gòu)編譯器22可以在任何計(jì)算機(jī)可訪問(wèn)的介質(zhì)上編碼。一般而言,計(jì)算機(jī)可訪問(wèn)的介質(zhì)可以包括可供計(jì)算機(jī)訪問(wèn)的任何介質(zhì),用來(lái)向計(jì)算機(jī)提供指令和/或數(shù)據(jù)。例如,計(jì)算機(jī)可訪問(wèn)的介質(zhì)可以包括諸如磁性或光學(xué)介質(zhì)之類的存儲(chǔ)介質(zhì),例如,磁盤(pán)(固定或可移動(dòng))、CD-ROM或DVD-ROM,易失性或非易失性存儲(chǔ)器介質(zhì),如RAM(例如,SDRAM、RDRAM、SRAM等等),ROM、閃速存儲(chǔ)器等等,以及通過(guò)傳輸介質(zhì)可訪問(wèn)的介質(zhì),或通過(guò)諸如網(wǎng)絡(luò)和/或無(wú)線鏈路之類的通信介質(zhì)傳輸?shù)闹T如電的、電磁的信號(hào)或數(shù)字信號(hào)。
在一些實(shí)施例中,計(jì)算機(jī)可訪問(wèn)的介質(zhì)可以包括在單獨(dú)的計(jì)算機(jī)系統(tǒng)中,這種計(jì)算機(jī)系統(tǒng)可以執(zhí)行樣式表編譯器20和/或架構(gòu)編譯器22以執(zhí)行編譯。由編譯而產(chǎn)生的數(shù)據(jù)結(jié)構(gòu)/代碼可以傳遞到內(nèi)容轉(zhuǎn)換設(shè)備10(例如,通過(guò)網(wǎng)絡(luò)連接傳遞到內(nèi)容轉(zhuǎn)換設(shè)備10)。
值得注意的是,盡管這里的描述可以包括其中樣式表應(yīng)用于文檔的示例,但是,其他示例也可以包括將多個(gè)樣式表應(yīng)用到文檔(依照要求,并行地或串行地),以及將樣式表應(yīng)用到多個(gè)文檔(依照要求,并行地,具有上下文切換或者串行地)的情況。
下面請(qǐng)參考圖2,顯示了文檔處理器16的一個(gè)實(shí)施例的方框圖。在圖2的實(shí)施例中,文檔處理器16包括分析器電路40、表達(dá)式處理器42、轉(zhuǎn)換引擎44、輸出生成器46,以及驗(yàn)證器電路48。分析器電路40連接到表達(dá)式處理器42和輸出生成器46。表達(dá)式處理器42連接到轉(zhuǎn)換引擎44,而轉(zhuǎn)換引擎44連接到輸出生成器46。驗(yàn)證器48連接到輸出生成器46。圖2中的單元可以彼此直接連接(例如,使用單元之間的信號(hào)線),也可以通過(guò)存儲(chǔ)器18進(jìn)行連接(例如,源單元可以將待傳遞到目標(biāo)單元的信息寫(xiě)入到存儲(chǔ)器18中,目標(biāo)單元可以從存儲(chǔ)器18中讀取信息)或采用兩種方式連接。
分析器電路40可以接收文檔,并對(duì)文檔進(jìn)行分析,為表達(dá)式處理器42和驗(yàn)證器電路48標(biāo)識(shí)事件,也可以用被分析的內(nèi)容生成數(shù)據(jù)結(jié)構(gòu)。如果文檔處理器16根據(jù)樣式表轉(zhuǎn)換文檔,則被分析的內(nèi)容可以存儲(chǔ)在存儲(chǔ)器18中的數(shù)據(jù)結(jié)構(gòu)中,供轉(zhuǎn)換引擎44使用?;蛘撸绻臋n將只被分析,則分析器電路40可以給輸出生成器46提供被分析的內(nèi)容,以便以SAX或DOM格式輸出。分析器電路40也可以通過(guò)存儲(chǔ)器18給輸出生成器46提供被分析的內(nèi)容。
表達(dá)式處理器42從分析器電路40接收事件(標(biāo)識(shí)從文檔分析的文檔節(jié)點(diǎn)),并將由分析器電路40標(biāo)識(shí)的文檔節(jié)點(diǎn)對(duì)照分析時(shí)表達(dá)式樹(shù)進(jìn)行比較。表達(dá)式處理器42將每一個(gè)表達(dá)式的匹配文檔節(jié)點(diǎn)的列表輸出到轉(zhuǎn)換引擎44。轉(zhuǎn)換引擎44接收由分析器電路40生成的被分析的內(nèi)容的數(shù)據(jù)結(jié)構(gòu)和匹配文檔節(jié)點(diǎn)的列表,并執(zhí)行來(lái)自指令表30的對(duì)應(yīng)的指令,以為輸出文檔生成結(jié)果。在一些實(shí)施例中,每一個(gè)指令都可以獨(dú)立于其他指令,如此,可以以任何順序執(zhí)行。輸出生成器46可以按順序?qū)⒔Y(jié)果重新組合起來(lái),并可以將輸出文檔寫(xiě)入到存儲(chǔ)器18中(也可以將輸出文檔發(fā)送到處理器14A-14B,而不經(jīng)過(guò)存儲(chǔ)器18)。處理器14A-14B可以執(zhí)行軟件,以讀取輸出文檔,并將輸出文檔傳輸?shù)秸?qǐng)求者。
驗(yàn)證器電路48還可以接收由分析器電路40發(fā)送的事件,并可以應(yīng)用架構(gòu)/DTD(如骨架樹(shù)和DTD表34所表示的),并可以判斷文檔是否有效,如架構(gòu)中所指出的。如果文檔有效,則驗(yàn)證器電路48可以生成成功消息,以傳輸?shù)捷敵錾善?6。如果文檔無(wú)效,則驗(yàn)證器電路48可以生成失敗消息(并指出失敗的理由),并可以將失敗消息傳輸?shù)捷敵錾善?6。輸出生成器46可以將消息存儲(chǔ)到存儲(chǔ)器18中(并且處理器14A-14B可以隨后將消息傳輸?shù)秸?qǐng)求者)。
現(xiàn)在請(qǐng)看圖3,該圖顯示了文檔處理器16(具體來(lái)說(shuō),分析器電路40、表達(dá)式處理器42,以及轉(zhuǎn)換引擎44)和處理器14A的一部分。圖3比較詳細(xì)地突出顯示了根據(jù)內(nèi)容轉(zhuǎn)換設(shè)備10的一個(gè)實(shí)施例在所說(shuō)明的部分之間的通信。處理器14B還可以以為處理器14A描述的方式來(lái)進(jìn)行操作。
處理器14A可以從內(nèi)容轉(zhuǎn)換設(shè)備10所連接的網(wǎng)絡(luò)接收數(shù)據(jù)包。數(shù)據(jù)包的數(shù)據(jù)有效負(fù)載可以包括待由內(nèi)容轉(zhuǎn)換設(shè)備10轉(zhuǎn)換的文檔。此外,其他接收到的數(shù)據(jù)包還可以包括其他通信(例如,樣式表或架構(gòu),或與內(nèi)容轉(zhuǎn)換設(shè)備10的其他通信)。處理器14A可以將文檔重新組合起來(lái),并將重新組合的文檔傳遞到分析器電路40。
分析器電路40從處理器14A接收重新組合的文檔,還可從存儲(chǔ)器18中對(duì)符號(hào)表24、DTD表34,以及空格表32進(jìn)行訪問(wèn)。分析器電路40對(duì)文檔進(jìn)行分析,并生成與檢測(cè)到的文檔節(jié)點(diǎn)相關(guān)的事件。具體來(lái)說(shuō),分析器電路40將文檔中的節(jié)點(diǎn)標(biāo)識(shí)符轉(zhuǎn)換為符號(hào)表24中的對(duì)應(yīng)的序列號(hào),并作為事件的一部分將序列號(hào)傳輸?shù)奖磉_(dá)式處理器42。此外,分析器電路40還為轉(zhuǎn)換引擎44生成被分析的內(nèi)容表,該表存儲(chǔ)了文檔的被分析的內(nèi)容。表達(dá)式處理器42從分析器40接收事件,并將標(biāo)識(shí)的文檔節(jié)點(diǎn)(基于它們的序列號(hào))針對(duì)分析時(shí)表達(dá)式樹(shù)26進(jìn)行比較。匹配文檔節(jié)點(diǎn)被標(biāo)識(shí)并記錄在模板和表達(dá)式匹配列表中,以便發(fā)送到轉(zhuǎn)換引擎44中。
轉(zhuǎn)換引擎44接收模板和表達(dá)式匹配列表以及被分析的內(nèi)容表,還接收指令表30。轉(zhuǎn)換引擎44對(duì)任何運(yùn)行時(shí)表達(dá)式進(jìn)行求值,并從模板和表達(dá)式匹配列表中消除不滿足運(yùn)行時(shí)表達(dá)式的文檔節(jié)點(diǎn)。此外,轉(zhuǎn)換引擎44在匹配該表達(dá)式的每一個(gè)文檔節(jié)點(diǎn)上為每一個(gè)表達(dá)式執(zhí)行來(lái)自指令表30的指令,并將結(jié)果輸出到輸出生成器46。
在所說(shuō)明的實(shí)施例中,處理器14A可以內(nèi)聯(lián)地傳輸重新組合的文檔,分析器電路也可以內(nèi)聯(lián)地將事件傳輸?shù)奖磉_(dá)式處理器42。即,隨著處理器14A接收和重新組合文檔的某些部分,處理器14A將文檔的一部分傳遞到分析器電路40。如此,在處理器14A接收到整個(gè)文檔之前,分析器電路40可以開(kāi)始進(jìn)行分析。類似地,在標(biāo)識(shí)事件時(shí),事件被傳遞到表達(dá)式處理器42。另一方面,被分析的內(nèi)容表和模板/表達(dá)式匹配列表被通過(guò)存儲(chǔ)器18傳遞(由到轉(zhuǎn)換引擎44的通信上方的虛線橢圓表示)。如這里所使用的,如果數(shù)據(jù)是直接傳遞的,而不是緩存在諸如存儲(chǔ)器18之類的存儲(chǔ)器中(雖然源或接收器可以將數(shù)據(jù)臨時(shí)排成隊(duì)列,以供傳輸),則數(shù)據(jù)從源“內(nèi)聯(lián)地”傳輸?shù)浇邮掌?。?nèi)聯(lián)地傳輸?shù)臄?shù)據(jù)遇到的延遲比通過(guò)存儲(chǔ)器進(jìn)行傳輸所遇到的延遲小。
現(xiàn)在請(qǐng)看圖4,該圖顯示了說(shuō)明用于轉(zhuǎn)換文檔的方法的一個(gè)實(shí)施例的流程圖。一般而言,該方法可以應(yīng)用于文檔轉(zhuǎn)換包括多個(gè)階段的場(chǎng)合。樣式表中的表達(dá)式可以根據(jù)可以對(duì)表達(dá)式進(jìn)行求值的最早的階段進(jìn)行分類。然后,在每一個(gè)階段,對(duì)可以在該階段進(jìn)行求值的表達(dá)式進(jìn)行求值。如此,可以在盡可能最早的階段對(duì)每一個(gè)表達(dá)式進(jìn)行求值,使得留在稍后的階段求值的表達(dá)式變得較少。
在所說(shuō)明的實(shí)施例中,階段可以包括編譯階段、分析階段以及轉(zhuǎn)換階段。在編譯階段,樣式表中的表達(dá)式被特征化(例如,在此實(shí)施例中,被特征化為編譯時(shí)、分析時(shí)或者運(yùn)行時(shí))(方框50)。此外,在編譯階段,對(duì)編譯時(shí)表達(dá)式進(jìn)行求值(方框52)。在分析階段,對(duì)分析時(shí)表達(dá)式進(jìn)行求值(方框54)。在轉(zhuǎn)換階段,對(duì)運(yùn)行時(shí)表達(dá)式進(jìn)行求值(方框56)。
在一些實(shí)施例中,運(yùn)行時(shí)表達(dá)式可以被分成可以較早地求值的部分(例如,分析時(shí))和運(yùn)行時(shí)部分。可以根據(jù)運(yùn)行時(shí)部分對(duì)可較早地求值的部分進(jìn)行求值和加以組合。即,匹配表達(dá)式的分析時(shí)部分的文檔節(jié)點(diǎn)和具有用于表達(dá)式的運(yùn)行時(shí)部分的相同值的文檔節(jié)點(diǎn)被分組在一起。在運(yùn)行時(shí),對(duì)表達(dá)式的運(yùn)行時(shí)部分進(jìn)行求值,如果對(duì)應(yīng)于一個(gè)組的值不滿足表達(dá)式的運(yùn)行時(shí)部分,則淘汰該組。只有滿足表達(dá)式的運(yùn)行時(shí)部分的組才被保留,在保留的組中的文檔節(jié)點(diǎn)上執(zhí)行指令。
在實(shí)現(xiàn)了XSLT樣式表的一個(gè)實(shí)施例中,如果一個(gè)表達(dá)式不包括祖先/后代引用(//)并且不包括謂詞,則該表達(dá)式可以是編譯時(shí)。如果一個(gè)表達(dá)式不包括引用了當(dāng)前節(jié)點(diǎn)、后面的兄弟節(jié)點(diǎn)或元素值的謂詞,則該表達(dá)式可以是分析時(shí)。不是編譯時(shí)或分析時(shí)的表達(dá)式是運(yùn)行時(shí)表達(dá)式(例如,引用了當(dāng)前節(jié)點(diǎn)或包含引用了后面的兄弟或元素值的謂詞的表達(dá)式)。對(duì)于不引用當(dāng)前節(jié)點(diǎn)的運(yùn)行時(shí)表達(dá)式,可以在分析時(shí)對(duì)不包括上文所提及的謂詞的部分進(jìn)行求值。關(guān)于這一點(diǎn),如果表達(dá)式是模板匹配表達(dá)式,則當(dāng)前節(jié)點(diǎn)可以是上下文節(jié)點(diǎn),也可以是在模板正文內(nèi)的語(yǔ)句中被引用的節(jié)點(diǎn)(例如模板正文內(nèi)的循環(huán)構(gòu)造或者其他表達(dá)式)。
哪些表達(dá)式是分析時(shí)或運(yùn)行時(shí),部分地受到表達(dá)式處理器42的內(nèi)聯(lián)本質(zhì)的影響。即,文檔節(jié)點(diǎn)被內(nèi)聯(lián)地標(biāo)識(shí)和傳遞到表達(dá)式處理器42。相比之下,如果表達(dá)式處理不是內(nèi)聯(lián)的,則當(dāng)處理特定節(jié)點(diǎn)時(shí),可能定位以前的和將來(lái)的文檔節(jié)點(diǎn)。如此,如果表達(dá)式處理不是內(nèi)聯(lián)的,則只有引用了當(dāng)前節(jié)點(diǎn)的表達(dá)式可能不會(huì)被處理。對(duì)于內(nèi)聯(lián)處理,針對(duì)表達(dá)式樹(shù)的匹配文檔節(jié)點(diǎn)一般可以包括保留有關(guān)表達(dá)式樹(shù)中的哪些表達(dá)式節(jié)點(diǎn)與前面的文檔節(jié)點(diǎn)匹配的信息。然后,如果前面的文檔節(jié)點(diǎn)的子或后代由分析器電路40標(biāo)識(shí),則這樣的子/后代文檔節(jié)點(diǎn)可以與表達(dá)式樹(shù)中的鏈接到表達(dá)式樹(shù)中的以前匹配的表達(dá)式節(jié)點(diǎn)的后續(xù)的級(jí)別相比。
對(duì)編譯時(shí)表達(dá)式進(jìn)行求值可以應(yīng)用于“apply templates select”語(yǔ)句中的表達(dá)式。如上所述,“apply templates”語(yǔ)句選擇模板正文的上下文中的一組節(jié)點(diǎn),并將模板應(yīng)用到節(jié)點(diǎn)?!癮pply templates select”語(yǔ)句包括選擇一組節(jié)點(diǎn)的表達(dá)式。然后,將該組節(jié)點(diǎn)應(yīng)用于樣式表中的模板。如果“apply templates select”語(yǔ)句中的表達(dá)式符合上文給出的編譯時(shí)定義,那么,編譯器可以判斷該組中的節(jié)點(diǎn)可以匹配哪些模板(如果有的話)。如此,在這樣的情況下,可以免除模板匹配。在一個(gè)實(shí)施例中,編譯器可以執(zhí)行apply templates select語(yǔ)句中的表達(dá)式和包括模板匹配條件的表達(dá)式之間的代數(shù)匹配。對(duì)分析時(shí)和運(yùn)行時(shí)表達(dá)式進(jìn)行求值可以包括判斷哪些節(jié)點(diǎn)滿足表達(dá)式。
在一個(gè)實(shí)施例中,由XML架構(gòu)所描述的XML文檔的上下文中的XPath表達(dá)式的代數(shù)匹配可以按如下方式執(zhí)行。下面的定義在描述XPath表達(dá)式和XML架構(gòu)的代數(shù)匹配算法時(shí)是有用的。如果P是XPath表達(dá)式而S是XML架構(gòu),當(dāng)且僅當(dāng)在S中聲明了在P中出現(xiàn)的每一個(gè)元素和屬性名稱并且在S中具有相同類型(元素或?qū)傩?時(shí),才可以為S定義P。如果P和Q是兩個(gè)XPath表達(dá)式,則當(dāng)且僅當(dāng)基于S的任何輸入文檔D中的滿足P的每一個(gè)節(jié)點(diǎn)也都滿足Q時(shí),對(duì)于S,P才可以被稱為匹配Q?!昂?jiǎn)單”表達(dá)式可以是排除了″//″運(yùn)算符和″.″運(yùn)算符的表達(dá)式。給定了這些定義,對(duì)于表達(dá)式P和一組一個(gè)或多個(gè)簡(jiǎn)單表達(dá)式E,可以按如下方式執(zhí)行一個(gè)實(shí)施例中的代數(shù)匹配。首先,可以規(guī)范化表達(dá)式。以″/″開(kāi)始的表達(dá)式是規(guī)范化格式。如果表達(dá)式Q不以″/″開(kāi)始,則按如下方式對(duì)其進(jìn)行規(guī)范化(i)如果Q在任何循環(huán)的范圍之內(nèi),則對(duì)于每一個(gè)循環(huán),用選擇表達(dá)式將Q預(yù)先掛起(通過(guò)/運(yùn)算符將每一個(gè)選擇表達(dá)式和Q分開(kāi)),最內(nèi)層循環(huán)選擇表達(dá)式是最近的Q,并作為預(yù)先掛起的表達(dá)式的開(kāi)始,進(jìn)入最外面的循環(huán)選擇表達(dá)式;(ii)用其中出現(xiàn)了Q的模板的模板匹配條件將由(i)形成的表達(dá)式預(yù)先掛起;并且(iii)如果模板匹配條件不是″/″,用″//″將由(i)和(ii)形成的表達(dá)式預(yù)先掛起。類似于分析時(shí)表達(dá)式樹(shù)26,可以形成表達(dá)式樹(shù),如簡(jiǎn)單表達(dá)式E(按上文所述的方式,已規(guī)范化),只是忽略了謂詞。如此,相同的表達(dá)式(具有可能的謂詞的例外)可以被映射到表達(dá)式樹(shù)中的相同路徑,并與表達(dá)式樹(shù)中的相同葉節(jié)點(diǎn)關(guān)聯(lián)。將P與表達(dá)式樹(shù)進(jìn)行匹配(即,如果P中的每一個(gè)節(jié)點(diǎn)標(biāo)識(shí)符或運(yùn)算符在同一個(gè)位置匹配表達(dá)式樹(shù),則存在匹配)。如果在P窮盡的同時(shí)到達(dá)了表達(dá)式樹(shù)中的葉節(jié)點(diǎn),與該葉節(jié)點(diǎn)關(guān)聯(lián)的表達(dá)式是E中的匹配P的表達(dá)式。這些匹配表達(dá)式可以是編譯時(shí)表達(dá)式,可以將這些表達(dá)式消除。
現(xiàn)在請(qǐng)看圖5,該圖是顯示了樣式表編譯器20的一個(gè)實(shí)施例的流程圖。在其中樣式表編譯器20是以軟件實(shí)現(xiàn)的實(shí)施例中,樣式表編譯器20包括指令,當(dāng)執(zhí)行這些指令時(shí),實(shí)現(xiàn)了圖5所示的功能。值得注意的是,盡管圖5中的方框顯示了樣式表編譯器20的功能,但是,該流程圖并不意味著,編譯器按照所列出的順序來(lái)執(zhí)行功能,也不意味著,在開(kāi)始下一功能之前,樣式表上的一個(gè)功能必須整個(gè)地都完成。
樣式表編譯器20標(biāo)識(shí)樣式表中的表達(dá)式(方框60),并將表達(dá)式分類為編譯時(shí)、分析時(shí)或運(yùn)行時(shí)。表達(dá)式可以在樣式表中的模板匹配語(yǔ)句中,在應(yīng)用模板語(yǔ)句中,以及在各種其他語(yǔ)句中。樣式表編譯器20生成每一個(gè)表達(dá)式的規(guī)范格式(方框62)。一般而言,可以有許多不同的方式來(lái)表示給定表達(dá)式,即使不同的方式在邏輯上是等效的。規(guī)范格式指定了表示給定表達(dá)式的特定方式,以簡(jiǎn)化標(biāo)識(shí)等效表達(dá)式(或表達(dá)式的等效的某些部分)的過(guò)程。樣式表編譯器20向表達(dá)式中的節(jié)點(diǎn)標(biāo)識(shí)符分配序列號(hào)(方框64)。
樣式表編譯器20可以對(duì)表達(dá)式執(zhí)行共同的前綴壓縮,以構(gòu)建分析時(shí)表達(dá)式樹(shù)(方框66)。如上所述,表達(dá)式一般可以包括將與文檔中的節(jié)點(diǎn)標(biāo)識(shí)符進(jìn)行匹配的節(jié)點(diǎn)標(biāo)識(shí)符的分層列表。如此,各種表達(dá)式可以具有共同的部分(具體來(lái)說(shuō),在層次結(jié)構(gòu)中較高的表達(dá)式節(jié)點(diǎn)即與根靠近的表達(dá)式節(jié)點(diǎn),對(duì)于各種表達(dá)式可以是相同的)。如此,共同的部分可以位于表達(dá)式的第一部分(表達(dá)式的“前綴”)。通過(guò)將這樣的表達(dá)式一起壓縮在分析時(shí)表達(dá)式樹(shù)中,可以以分析時(shí)表達(dá)式樹(shù)一次性表示共同部分,一旦表達(dá)式開(kāi)始不同,則表達(dá)式的其余部分變?yōu)楣餐糠值淖硬糠?。相?yīng)地,在分析時(shí)表達(dá)式樹(shù)的共同部分中,可以并行地對(duì)可以匹配文檔節(jié)點(diǎn)的多個(gè)表達(dá)式進(jìn)行求值,并且當(dāng)存在差別時(shí),可以在樹(shù)中分叉。分析時(shí)表達(dá)式樹(shù)可以更加緊湊,并且在這樣的情況下,可以更快地對(duì)它們進(jìn)行處理。
例如,兩個(gè)表達(dá)式(在分配序列號(hào)之后)可以是/10/15/20/25和/10/15/20/30/35。這兩個(gè)表達(dá)式共同地具有/10/15/20/。相應(yīng)地,這兩個(gè)表達(dá)式可以作為包括節(jié)點(diǎn)10的共同部分以分析時(shí)表達(dá)式樹(shù)來(lái)表達(dá),節(jié)點(diǎn)10以節(jié)點(diǎn)15作為子節(jié)點(diǎn),而節(jié)點(diǎn)15以節(jié)點(diǎn)20作為子節(jié)點(diǎn)。節(jié)點(diǎn)20可以具有兩個(gè)子節(jié)點(diǎn)(25和30)。節(jié)點(diǎn)30可以以節(jié)點(diǎn)35作為子節(jié)點(diǎn)。隨著文檔節(jié)點(diǎn)被分析并傳遞到表達(dá)式處理器42,可以并行地對(duì)照文檔節(jié)點(diǎn)對(duì)表達(dá)式進(jìn)行求值,直到到達(dá)節(jié)點(diǎn)20。然后,可以將下一子文檔節(jié)點(diǎn)與表達(dá)式節(jié)點(diǎn)25或30中的零個(gè)或一個(gè)進(jìn)行匹配。
如前所述,樣式表編譯器20可以將運(yùn)行時(shí)表達(dá)式劃分為可以在分析時(shí)對(duì)其進(jìn)行求值的部分和在運(yùn)行時(shí)對(duì)其進(jìn)行求值的部分。分析時(shí)部分可以包括在分析時(shí)表達(dá)式樹(shù)中。在分析時(shí)表達(dá)式樹(shù)中的存在運(yùn)行時(shí)謂詞的每一個(gè)級(jí)別,樣式表編譯器20可能會(huì)注意到,匹配節(jié)點(diǎn)將被分組(并且可以保留運(yùn)行時(shí)謂詞所使用的信息),以便可以在運(yùn)行時(shí)對(duì)謂詞進(jìn)行求值,取決于匹配文檔節(jié)點(diǎn)是否滿足運(yùn)行時(shí)謂詞,要么保留要么丟棄匹配文檔節(jié)點(diǎn)。在表達(dá)式中的各個(gè)級(jí)別中,給定運(yùn)行時(shí)表達(dá)式可以包括一個(gè)以上的運(yùn)行時(shí)謂詞,如此,可以進(jìn)行多個(gè)級(jí)別的分組。在每一個(gè)分組級(jí)別,具有對(duì)應(yīng)于運(yùn)行時(shí)謂詞的相同值的文檔節(jié)點(diǎn)被分組在一起。當(dāng)對(duì)運(yùn)行時(shí)謂詞進(jìn)行求值時(shí),如果值不匹配運(yùn)行時(shí)謂詞,則丟棄該組文檔節(jié)點(diǎn)(以及該組的任何子組)。那些值匹配被求值的運(yùn)行時(shí)謂詞的組,將被保留,并由轉(zhuǎn)換引擎44進(jìn)行處理。
樣式表編譯器20可以向存儲(chǔ)器18輸出多個(gè)由分析器電路40和/或表達(dá)式處理器42使用的數(shù)據(jù)結(jié)構(gòu)(方框68)??梢暂敵龇治鰰r(shí)表達(dá)式樹(shù),以及將節(jié)點(diǎn)標(biāo)識(shí)符映射到序列號(hào)的一個(gè)或多個(gè)符號(hào)表24。例如,在一個(gè)實(shí)施例中,可以為元素名稱和屬性名稱輸出單獨(dú)的符號(hào)表。在其他實(shí)施例中,可以輸出單一的符號(hào)表。此外,樣式表編譯器20還可以為每一個(gè)模板輸出具有一組指令的指令表30,轉(zhuǎn)換引擎44可以執(zhí)行這些指令來(lái)執(zhí)行模板正文。樣式表20可以進(jìn)一步為每一個(gè)運(yùn)行時(shí)謂詞輸出指令,當(dāng)在轉(zhuǎn)換引擎中執(zhí)行指令時(shí),將對(duì)運(yùn)行時(shí)謂詞進(jìn)行求值。更進(jìn)一步,樣式表編譯器20還可以輸出如下所述的模板列表38和表達(dá)式列表36。
在一些實(shí)施例中,給定樣式表可以包括一個(gè)或多個(gè)其他樣式表和/或?qū)胍粋€(gè)或多個(gè)其他樣式表。就像被包括的樣式表在物理上被移到樣式表包體中(例如,類似于C語(yǔ)言中的#include語(yǔ)句的處理)那樣,對(duì)待被包括的樣式表。即,被包括的樣式表的正文可以基本上代替樣式表包體中的include語(yǔ)句。如果在被包括的樣式表和樣式表包體之間存在沖突(例如全局變量聲明),則使用樣式表包體中的定義。在XSLT樣式表中,可以在樣式表包體中的XSL:INCLUDE元素中闡述被包括的樣式表。另一方面,將被導(dǎo)入的樣式表當(dāng)做單獨(dú)的樣式表,該樣式表可以被樣式表包體中的語(yǔ)句顯式地引用??梢栽谀0迤ヅ湔Z(yǔ)句中進(jìn)行顯式引用(在這種情況下,使用來(lái)自被導(dǎo)入的樣式表中的模板)。如果顯式引用是在樣式表導(dǎo)入體中,那么,樣式表導(dǎo)入體中的匹配模板優(yōu)先于被導(dǎo)入的樣式表中的匹配模板。如果有多個(gè)被導(dǎo)入的樣式表,并且在一個(gè)以上的被導(dǎo)入的樣式表中存在匹配模板,則在樣式表導(dǎo)入體中列出被導(dǎo)入的樣式表的順序控制了將選擇哪一個(gè)匹配模板(例如,使用具有匹配的第一個(gè)列出的被導(dǎo)入的樣式表)。在XSLT樣式表中,可以在xsl:import元素中闡述被導(dǎo)入的樣式表。
由樣式表編譯器20獨(dú)立地編譯“主要”(導(dǎo)入體或包體)樣式表和每一個(gè)被導(dǎo)入或被包括的樣式表。在被包括的樣式表的情況下,主要樣式表和被包括的樣式表的數(shù)據(jù)結(jié)構(gòu)可以合并到由表達(dá)式處理器42使用的一個(gè)數(shù)據(jù)結(jié)構(gòu)集合。在被導(dǎo)入的樣式表的情況下,數(shù)據(jù)結(jié)構(gòu)可以仍分開(kāi),表達(dá)式處理器42可以并行地向文檔應(yīng)用數(shù)據(jù)結(jié)構(gòu)。這樣的實(shí)施例可以類似于表達(dá)式處理器42的實(shí)施例,只是匹配表達(dá)式中的沖突可以利用實(shí)現(xiàn)了上文所描述的沖突解決方案的沖突解決方案邏輯來(lái)進(jìn)行處理。
在一些實(shí)施例中,樣式表可以包括引用了一個(gè)或多個(gè)文檔(正在向其應(yīng)用樣式表的文檔之外的文檔)的語(yǔ)句。樣式表可以進(jìn)一步包括處理被引用的文檔的語(yǔ)句。在一個(gè)實(shí)施例中,樣式表編譯器20可以標(biāo)識(shí)無(wú)條件地使用哪些被引用的文檔(即,在樣式表應(yīng)用于任何文檔的每一種情況下,都可以使用被引用的文檔)。當(dāng)對(duì)輸入文檔的處理開(kāi)始時(shí),內(nèi)容轉(zhuǎn)換設(shè)備10可以獲取無(wú)條件地被引用的文檔,可以按照在樣式表中被引用的順序?qū)o(wú)條件地被引用的文檔進(jìn)行分析。如果轉(zhuǎn)換引擎44將執(zhí)行使用了被引用的文檔的指令,并且該被引用的文檔的分析還沒(méi)有開(kāi)始,則轉(zhuǎn)換引擎44可以上下文切換到不同的任務(wù)。對(duì)于有條件地被引用的文檔,響應(yīng)轉(zhuǎn)換引擎44試圖執(zhí)行使用文檔的指令的情況,內(nèi)容轉(zhuǎn)換設(shè)備10可以獲取文檔,此時(shí)可以對(duì)文檔進(jìn)行分析,如上文對(duì)待無(wú)條件地被引用的文檔那樣。在其他實(shí)施例中,當(dāng)在輸入文檔上調(diào)用一個(gè)樣式表時(shí),內(nèi)容轉(zhuǎn)換設(shè)備10可以獲取對(duì)應(yīng)于該樣式表的所有被引用的文檔,或響應(yīng)轉(zhuǎn)換引擎44試圖執(zhí)行使用該被引用的文檔的指令的情況,可以獲取每一個(gè)被引用的文檔。
圖6是說(shuō)明了架構(gòu)編譯器22的一個(gè)實(shí)施例的流程圖。在其中架構(gòu)編譯器22是以軟件實(shí)現(xiàn)的實(shí)施例中,架構(gòu)編譯器22包括指令,當(dāng)執(zhí)行這些指令時(shí),實(shí)現(xiàn)了圖6所示的功能。值得注意的是,盡管圖6中的方框顯示了架構(gòu)編譯器22的功能,但是,該流程圖并不意味著,編譯器按照所列出的順序來(lái)執(zhí)行功能,也不意味著,在開(kāi)始下一功能之前,樣式表上的一個(gè)功能必須整個(gè)地都完成。
類似于樣式表編譯器20,架構(gòu)編譯器22可以向架構(gòu)(或DTD)中的節(jié)點(diǎn)標(biāo)識(shí)符分配序列號(hào)(方框70)。由樣式表編譯器20分配給給定節(jié)點(diǎn)標(biāo)識(shí)符的序列號(hào)可以不與由架構(gòu)編譯器分配的序列號(hào)相同。
架構(gòu)編譯器22可以生成許多供分析器電路40使用的表。例如,實(shí)體引用可以被包括在文檔中,并且架構(gòu)/DTD可以定義實(shí)體的值??梢詣?chuàng)建DTD實(shí)體引用表,以將實(shí)體引用映射到對(duì)應(yīng)值。此外,如果可以包括屬性的給定元素不包括屬性,則架構(gòu)/DTD可以指定屬性的默認(rèn)值??梢詣?chuàng)建DTD默認(rèn)屬性,以記錄屬性和默認(rèn)值。此外,還可以創(chuàng)建標(biāo)識(shí)了允許的和必需文檔結(jié)構(gòu)的骨架樹(shù),供驗(yàn)證器用來(lái)判斷文檔是否有效(如架構(gòu)/DTD中所定義的)。架構(gòu)編譯器22向存儲(chǔ)器18輸出符號(hào)表、DTD表,以及骨架樹(shù)(方框72)。
現(xiàn)在請(qǐng)參看圖7,該圖顯示了分析器電路40、分析器電路40的一個(gè)實(shí)施例的輸入數(shù)據(jù)結(jié)構(gòu)和輸出數(shù)據(jù)結(jié)構(gòu)的方框圖。在所說(shuō)明的實(shí)施例中,由分析器電路40使用的輸入數(shù)據(jù)結(jié)構(gòu)可以包括DTD實(shí)體引用表34A和DTD屬性列表34B(可以是DTD表34的某些部分)、空格表32,以及符號(hào)表24。分析器40可以創(chuàng)建并使用動(dòng)態(tài)符號(hào)表39A(文檔處理器結(jié)構(gòu)39的一部分)和一組被分析的內(nèi)容表39B(文檔處理器結(jié)構(gòu)39的一部分)。具體來(lái)說(shuō),在所說(shuō)明的實(shí)施例中,被分析的內(nèi)容表39B可以包括骨架表80、元素索引表82、元素名稱/值表84、屬性索引表86、屬性名稱/值表88、屬性列表90、處理指令/注釋(PI/C)表92、PI索引表94,以及元素目錄(TOC)96。被分析的內(nèi)容表39B可以用于轉(zhuǎn)換引擎44中的文檔轉(zhuǎn)換。在一些實(shí)施例中,分析器電路40還可以被配置為對(duì)于只分析請(qǐng)求以SAX或DOM格式輸出被分析的內(nèi)容。
分析器電路40可以被配置為在從處理器14A接收到文檔時(shí)對(duì)文檔進(jìn)行分析(圖7中未顯示),以生成被分析的內(nèi)容表39B。一般而言,被分析的內(nèi)容表39B可以包括各種文檔內(nèi)容的表,并帶有將信息鏈接到各個(gè)節(jié)點(diǎn)的指針。下面提供了關(guān)于如圖7所示的被分析的內(nèi)容表39B的比較詳細(xì)的信息。此外,分析器電路40還可以(i)對(duì)于文檔中的每一個(gè)節(jié)點(diǎn),生成前綴次序和后綴次序編號(hào);(ii)將實(shí)體引用代替為來(lái)自DTD/架構(gòu)的實(shí)體值;(iii)將預(yù)先定義的實(shí)體引用(如XML規(guī)范中所描述的)代替為對(duì)應(yīng)的字符;(iv)添加來(lái)自DTD/架構(gòu)的默認(rèn)屬性和/或?qū)傩灾担?v)將CDATA部分代替為字符;(vi)按樣式表所指示的,剝離或保留空格,并規(guī)范化空格;以及(vii)標(biāo)識(shí)嵌入的DTD/樣式表或?qū)TD/樣式表的嵌入的引用。
為將實(shí)體引用代替為實(shí)體值,分析器40可以使用DTD實(shí)體引用表34A。如果在文檔中遇到了實(shí)體引用,則分析器電路40可以查詢DTD實(shí)體引用表34A中的實(shí)體引用,并從DTD實(shí)體引用表34A中讀取對(duì)應(yīng)的實(shí)體值。實(shí)體值為文檔代替由分析器電路40輸出的被分析的內(nèi)容中的實(shí)體引用。在一個(gè)實(shí)施例中,DTD實(shí)體引用表34A可以包含具有多個(gè)條目的初始部分,其中,每一個(gè)條目都存儲(chǔ)了散列的實(shí)體引用(例如,循環(huán)冗余代碼(CRC)-16散列),還包括指向DTD實(shí)體引用表34A的第二部分的指針,在該第二部分,存儲(chǔ)了包括實(shí)體值的字符串。分析器電路40可以散列文檔中檢測(cè)到的實(shí)體引用,并將散列與DTD實(shí)體引用表34A的初始部分中的散列值進(jìn)行比較,以定位第二部分中的匹配實(shí)體值。
為將默認(rèn)屬性或?qū)傩灾堤砑拥轿臋n,分析器電路40可以使用DTD屬性列表34B。DTD屬性列表34B可以包含各個(gè)元素名稱的默認(rèn)屬性和/或?qū)傩灾?,分析器電?0可以查找文檔內(nèi)的元素開(kāi)始標(biāo)記中檢測(cè)到的元素名稱,以判斷對(duì)于元素是否包括了任何默認(rèn)屬性或?qū)傩灾?。如果包括了默認(rèn)值,則分析器40可以跟蹤元素開(kāi)始標(biāo)記中包括的屬性,直到檢測(cè)到元素關(guān)閉。如果元素中沒(méi)有包括DTD屬性列表34B中的屬性和/或?qū)傩灾担瑒t分析器電路40可以從DTD屬性列表34B插入屬性/屬性值。在一個(gè)實(shí)施例中,DTD屬性列表34B可以具有包括被散列的元素名稱(例如,CRC-16散列)的初始部分和指向DTD屬性列表34B的第二部分的指針。第二部分可以包括被散列的屬性名稱(例如,CRC-16散列)和指向DTD屬性列表34B的第三部分的指針,在該第三部分,作為字符串存儲(chǔ)了默認(rèn)屬性名稱/值。分析器電路40可以散列元素名稱,查詢初始部分中的散列,并且,如果在第一部分查找到匹配,則從第二部分讀取被散列的屬性名稱和指針。隨著檢測(cè)到每一個(gè)屬性名稱,分析器電路40可以散列屬性名稱,并將它們與來(lái)自DTD屬性列表34B的被散列的屬性名稱進(jìn)行比較。當(dāng)檢測(cè)到元素關(guān)閉時(shí),文檔中的沒(méi)有被分析器電路40檢測(cè)出的任何被散列的屬性名稱可以是需要其默認(rèn)值的屬性,可以從DTD屬性列表34B的第三部分讀取默認(rèn)值,并插入到被分析的內(nèi)容表39B中。
空格表32可以指出哪些元素名稱將被剝離空格,如樣式表所指定的。在一個(gè)實(shí)施例中,可以散列將剝離其空格的每一個(gè)元素名稱(例如,CRC-16散列算法),散列值存儲(chǔ)在表中。當(dāng)分析器電路40檢測(cè)到文檔中的元素名稱時(shí),分析器電路40可以散列元素名稱,并在空格表32中查找它。如果查找到匹配,則分析器電路40可以從元素中剝離空格。否則,分析器電路40可以將空格保留在元素中。
如上所述,符號(hào)表24可以將節(jié)點(diǎn)標(biāo)識(shí)符映射到由樣式表編譯器所分配的序列號(hào)。分析器電路40可以使用符號(hào)表24以將文檔中的元素或?qū)傩悦Q(如果使用了命名空間,則由命名空間前綴限定)轉(zhuǎn)換為序列號(hào),以傳遞給表達(dá)式處理器42。然而,文檔有可能包含不以樣式表表示的元素或?qū)傩?。在這樣的情況下,分析器電路40可以分配序列號(hào),并將序列號(hào)存儲(chǔ)在動(dòng)態(tài)符號(hào)表39A中。圖8的流程圖顯示了當(dāng)檢測(cè)文檔中的元素或?qū)傩詴r(shí)分析器電路40的操作的一個(gè)實(shí)施例。
分析器電路40可以掃描編譯器的符號(hào)表24,以查找節(jié)點(diǎn)標(biāo)識(shí)符(例如,元素/屬性名稱,可選地,帶有命名空間前綴)(方框100)。如果發(fā)現(xiàn)了一個(gè)條目(判斷方框102,“是”支線),則分析器電路40可以從編譯器的符號(hào)表24中讀取序列號(hào)(方框104)。如果沒(méi)有發(fā)現(xiàn)一個(gè)條目(判斷方框102,“否”支線),則分析器電路40可以掃描動(dòng)態(tài)符號(hào)表39A以查找節(jié)點(diǎn)標(biāo)識(shí)符(方框106)。如果發(fā)現(xiàn)了一個(gè)條目(判斷方框108,“是”支線),則分析器電路40可以從動(dòng)態(tài)符號(hào)表中讀取序列號(hào)(方框110)。如果沒(méi)有發(fā)現(xiàn)一個(gè)條目(判斷方框108,“否”支線),則分析器電路40可以生成唯一的序列號(hào)(還沒(méi)有記錄在編譯器的符號(hào)表24中,也沒(méi)有記錄在動(dòng)態(tài)符號(hào)表39A中的序列號(hào)),并可以用生成的序列號(hào)和節(jié)點(diǎn)標(biāo)識(shí)符更新動(dòng)態(tài)符號(hào)表39A(方框112)。在任何情況下,分析器電路40都可以將一個(gè)事件中的序列號(hào)傳輸?shù)奖磉_(dá)式處理器42(方框114)。
值得注意的是,一個(gè)元素常常具有多個(gè)子(元素或?qū)傩?,它們具有相同名稱(例如,相同子元素或?qū)傩缘亩鄠€(gè)實(shí)例)。如此,當(dāng)在輸入中檢測(cè)到了一個(gè)節(jié)點(diǎn)標(biāo)識(shí)符時(shí),則下一個(gè)節(jié)點(diǎn)標(biāo)識(shí)符有可能相同(或者,有可能在檢測(cè)到的下面的幾個(gè)名稱內(nèi)重現(xiàn)節(jié)點(diǎn)標(biāo)識(shí)符)。在一些實(shí)施例中,分析器電路42可以保留一個(gè)或多個(gè)最近檢測(cè)到的名稱和對(duì)應(yīng)的序列號(hào),并在搜索符號(hào)表24和動(dòng)態(tài)符號(hào)表39A之前,可以將新檢測(cè)到的節(jié)點(diǎn)標(biāo)識(shí)符與這些名稱進(jìn)行比較。
在一些實(shí)施例中,對(duì)于在編譯器的符號(hào)表24中不匹配的節(jié)點(diǎn),可以實(shí)施優(yōu)化。由于編譯器向樣式表中的每一個(gè)節(jié)點(diǎn)標(biāo)識(shí)符分配序列號(hào),因此,已知,不匹配編譯器的符號(hào)表24的節(jié)點(diǎn)也不匹配分析時(shí)表達(dá)式樹(shù)36中的任何節(jié)點(diǎn)。分析器電路40可以在每一個(gè)事件中包括關(guān)于序列號(hào)是來(lái)自于編譯器的符號(hào)表24還是來(lái)自于動(dòng)態(tài)符號(hào)表39A的指示。如果序列號(hào)不是來(lái)自編譯器的符號(hào)表24,則表達(dá)式處理器42可以不將事件與分析時(shí)表達(dá)式樹(shù)36進(jìn)行比較。表達(dá)式處理器42可以記錄事件,用于其他目的(例如,對(duì)于一些事件類型,任何“/”表達(dá)式節(jié)點(diǎn)子節(jié)點(diǎn)都可以不必被隨后的事件匹配)。
在一個(gè)實(shí)施例中,分析器電路40可以生成多個(gè)事件,并帶有序列號(hào)地(在一些實(shí)施例中,還有前綴次序編號(hào))傳輸?shù)奖磉_(dá)式處理器42。如果檢測(cè)到元素開(kāi)始標(biāo)記,則可以生成元素開(kāi)始事件,而序列號(hào)可以是對(duì)應(yīng)于元素名稱的序列號(hào)。如果檢測(cè)到元素結(jié)束標(biāo)記,則可以生成元素結(jié)束事件,而序列號(hào)可以是對(duì)應(yīng)于元素名稱的序列號(hào)。如果在元素開(kāi)始標(biāo)記中檢測(cè)到屬性名稱,則可以生成屬性名稱事件,序列號(hào)可以是屬性名稱的序列號(hào)。當(dāng)檢測(cè)到元素開(kāi)始標(biāo)記的末尾時(shí),可以生成元素關(guān)閉事件,而序列號(hào)可以是元素的序列號(hào)。還可以生成配置事件,以為表達(dá)式處理器42建立所希望的樣式表/文檔上下文。
在一個(gè)實(shí)施例中,可以作為單個(gè)字符的樹(shù)來(lái)排列符號(hào)表24。表中的每一個(gè)條目都可以包括字符、葉節(jié)點(diǎn)指示、級(jí)別結(jié)尾指示,以及指向條目的第一個(gè)子條目的指針或者如果條目是節(jié)點(diǎn)標(biāo)識(shí)符的最后一個(gè)字母,則為序列號(hào)。從表的頂部開(kāi)始,在一個(gè)條目中提供了名稱的每一個(gè)唯一第一字符,條目被表示為非葉節(jié)點(diǎn),指針被設(shè)置為存儲(chǔ)了名稱的下一字符的第一條目。具有第一字符的名稱的每一個(gè)唯一第二字符分組在指針中的一系列條目中,并具有指向第一子(第三字符)等等的指針。當(dāng)?shù)竭_(dá)給定名稱的最后一個(gè)字符時(shí),葉節(jié)點(diǎn)指示指出了該條目是葉,指針字段是序列號(hào)。當(dāng)?shù)竭_(dá)級(jí)別中的最后一個(gè)唯一字符時(shí),由級(jí)別結(jié)尾指示指出系列的結(jié)尾。類似地,可以使用級(jí)別結(jié)尾指示來(lái)標(biāo)記條目的第一級(jí)別的結(jié)尾(對(duì)于名稱的第一字符)。如此,對(duì)符號(hào)表24進(jìn)行掃描可以包括沿著樹(shù)向下一個(gè)字符一個(gè)字符地,將檢測(cè)到的名稱與符號(hào)表24中的字符進(jìn)行比較。
在一個(gè)實(shí)施例中,可以以稍微不同的方式來(lái)組織動(dòng)態(tài)符號(hào)表39A。名稱基于名稱中的第一字符而存儲(chǔ)在“箱柜”中。名稱的每一個(gè)可能的第一字符都可以被用作到動(dòng)態(tài)符號(hào)表39A的偏移。這些偏移中的每一個(gè)條目都可以包括bin指針和“bin中的最后一個(gè)條目”指針。在bin指針中有包括名稱的其余部分的字符串(即,字符2到名稱的結(jié)尾)、系列ID以及指向下一個(gè)bin條目的指針(即,bin條目可以是鏈接列表)??梢詫z測(cè)到的名稱與bin條目中的字符串進(jìn)行比較,如果檢測(cè)到匹配,可以使用系列ID。否則,使用指向下一個(gè)bin條目的指針來(lái)讀取下一個(gè)bin條目。如果到達(dá)了bin的結(jié)尾而沒(méi)有檢測(cè)到匹配,那么,為bin中的名稱添加新條目(并分配序列號(hào))。在一個(gè)特定實(shí)施例中,每一個(gè)bin條目都可以包括一個(gè)或多個(gè)分項(xiàng),這些分項(xiàng)被配置為存儲(chǔ)了多個(gè)字符(例如,2)和定義了所有字符都是有效的或者定位多個(gè)字符內(nèi)的字符串字符的結(jié)尾的代碼?!癰in中的最后一個(gè)條目”指針可以指向bin中的最后一個(gè)條目,并可以用來(lái)在添加新條目時(shí)更新下一個(gè)bin指針。
現(xiàn)在進(jìn)一步詳細(xì)描述一個(gè)實(shí)施例的被分析的內(nèi)容表39B。分析器電路40標(biāo)識(shí)文檔結(jié)構(gòu)/內(nèi)容,并基于檢測(cè)到的結(jié)構(gòu)/內(nèi)容,將文檔內(nèi)容寫(xiě)入到被分析的內(nèi)容表39B中的各個(gè)數(shù)據(jù)結(jié)構(gòu)。例如,分析器電路40可以將檢測(cè)到的元素名稱(和對(duì)應(yīng)的元素值/文本節(jié)點(diǎn))存儲(chǔ)在元素名稱/值表84,并可以作為字符串將檢測(cè)到的屬性名稱(和對(duì)應(yīng)的值)存儲(chǔ)在屬性名稱/值表88中。對(duì)應(yīng)的索引表82和86可以將指向?qū)?yīng)的字符串的開(kāi)始的指針?lè)謩e存儲(chǔ)在表84和88中。分別使用元素的序列號(hào)(圖7中的ES/N)或?qū)傩?圖7中的AS/N)來(lái)對(duì)索引表82和86進(jìn)行尋址。
處理指令/注釋(PI/C)表92存儲(chǔ)了對(duì)應(yīng)于處理指令和注釋的字符串。注釋可以作為存儲(chǔ)在元素TOC96中的指針?biāo)ㄎ坏淖址畞?lái)進(jìn)行存儲(chǔ)。處理指令可以包括兩個(gè)字符串值處理指令目標(biāo)部分(擴(kuò)展名稱)和處理指令值部分(來(lái)自文檔的處理指令的其余部分)??梢杂靡粚?duì)來(lái)自PI索引表94(用來(lái)自元素TOC 96的指針來(lái)索引)中的條目的指針來(lái)定位處理指令目標(biāo)和處理指令值。PI索引表94條目可以包括該對(duì)指針和分配給處理指令的序列號(hào)。
分析器電路40還可以為文檔中的每一個(gè)元素生成屬性列表90。屬性列表90可以是對(duì)應(yīng)于該元素的屬性的列表(按序列號(hào)),具有指向?qū)傩悦Q/值表88中的屬性名稱和屬性值(如果有的話)的指針。此外,分析器電路40可以為每一個(gè)元素生成元素TOC 96。元素TOC 96標(biāo)識(shí)對(duì)應(yīng)元素(例如,子元素、文本節(jié)點(diǎn)、注釋節(jié)點(diǎn),以及處理指令節(jié)點(diǎn))的子節(jié)點(diǎn)。元素TOC 96中的每一個(gè)條目都可以包括節(jié)點(diǎn)位置(與節(jié)點(diǎn)內(nèi)的其他子元素相比,標(biāo)識(shí)子元素的位置),節(jié)點(diǎn)類型(作為元素、文本、注釋或處理指令,標(biāo)識(shí)子節(jié)點(diǎn)),字段,該字段要么是節(jié)點(diǎn)內(nèi)容指針(對(duì)于注釋、處理指令或文本節(jié)點(diǎn)),或者子元素的前綴次序編號(hào)(對(duì)于元素節(jié)點(diǎn))。節(jié)點(diǎn)內(nèi)容指針是指向注釋節(jié)點(diǎn)的PI/C表92的指針,指向處理指令節(jié)點(diǎn)的PI索引表94的指針,或指向文本節(jié)點(diǎn)的元素名稱/值表84的指針。在一個(gè)實(shí)施例中,元素TOC 96可以是條目的鏈接列表,如此,每一個(gè)條目都可以進(jìn)一步包括指向列表中的下一個(gè)條目的指針。
骨架表80可以包括文檔中的每一個(gè)元素節(jié)點(diǎn)的條目,并可以通過(guò)元素節(jié)點(diǎn)的前綴次序編號(hào)來(lái)索引。在所說(shuō)明的實(shí)施例中,骨架表的任何條目都包括父節(jié)點(diǎn)的前綴次序編號(hào)(PPREO)、元素節(jié)點(diǎn)的緊前面的兄弟的前綴次序編號(hào)(IPSPREO),元素節(jié)點(diǎn)的后綴次序編號(hào)(PSTO),該編號(hào)也可以指出子樹(shù)(元素節(jié)點(diǎn)的后代)中的最后一個(gè)前綴次序編號(hào),元素序列號(hào)(ES/N),指向元素節(jié)點(diǎn)的屬性列表90的屬性列表指針(ALP),指向元素節(jié)點(diǎn)的元素TOC96的目錄指針(TOCP),以及指向模板列表38(在該模板列表中,列出了元素節(jié)點(diǎn)的匹配模板(如果有的話))中的條目的模板列表指針(TLP)。
值得注意的是,上文所描述的各個(gè)數(shù)據(jù)結(jié)構(gòu)包括字符串。在一個(gè)實(shí)施例中,字符串長(zhǎng)度(例如,字符數(shù))可以作為字符串的第一“字符”存儲(chǔ),并且分析器電路40可以使用字符串長(zhǎng)度來(lái)判斷要讀取多少字符。
對(duì)于XML文檔,可以使用分析器電路40的上述示例以及其輸出數(shù)據(jù)結(jié)構(gòu)。在一個(gè)實(shí)施例中,分析器電路40包括用于對(duì)XML文檔進(jìn)行分析的硬件電路。在一些實(shí)施例中,分析器電路40還可以包括用于對(duì)關(guān)系數(shù)據(jù)庫(kù)結(jié)構(gòu)(如SQL、Oracle等等)進(jìn)行分析的硬件電路。分析器電路40可以以類似于圖7中所顯示的數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)輸出被分析的關(guān)系數(shù)據(jù)庫(kù)結(jié)構(gòu),如此,表達(dá)式處理器42和轉(zhuǎn)換引擎44不必知道輸入是XML還是關(guān)系數(shù)據(jù)庫(kù)。
在一些實(shí)施例中,分析器電路40可以是可編程的,以對(duì)其他文檔類型進(jìn)行分析。分析器電路40可以用一個(gè)或多個(gè)輸入類型描述符來(lái)進(jìn)行編程。輸入類型描述符可以描述文檔中的結(jié)構(gòu)分隔符;指出文檔在本質(zhì)上是分層的還是表格的;指出分層文檔是否具有對(duì)每一層結(jié)構(gòu)的顯式結(jié)束;如果結(jié)尾不是顯式的,則定義如何檢測(cè)結(jié)構(gòu)的結(jié)尾;定義給定結(jié)構(gòu)單元內(nèi)的內(nèi)部結(jié)構(gòu),如果有的話。
在一些實(shí)施例中,還可以包括預(yù)分析器電路,該預(yù)分析器電路過(guò)濾由CPU 14A-14B所提供的文檔,以為分析器電路40生成已過(guò)濾的文檔。即,分析器電路40可以只接收文檔的通過(guò)了過(guò)濾器的那一部分,分析器電路40可以將接收到的部分當(dāng)作文檔的整體來(lái)進(jìn)行分析。例如,如果提供了相對(duì)比較大的輸入文檔,但是只對(duì)該文檔的一部分感興趣,就可以使用預(yù)分析器。預(yù)分析器可以被編程為以任何所希望的方式對(duì)文檔進(jìn)行過(guò)濾(例如,從文檔的開(kāi)始,跳過(guò)一定數(shù)量的字符,然后捕獲許多字符,或直到文檔的結(jié)尾;在捕獲文檔內(nèi)容之前,過(guò)濾到某一元素,或一定數(shù)量的元素;和/或標(biāo)識(shí)待捕獲的文檔的部分的比較復(fù)雜化的表達(dá)式(例如,XPath表達(dá)式)等等。預(yù)分析器可以由用戶編程,如果樣式表具有丟棄文檔內(nèi)容的效果,則由樣式表編譯器20編程。
下面請(qǐng)參考圖9,該圖顯示了表達(dá)式處理器42的一個(gè)實(shí)施例的表達(dá)式處理器42、輸入數(shù)據(jù)結(jié)構(gòu)、和輸出數(shù)據(jù)結(jié)構(gòu)的方框圖。在所說(shuō)明的實(shí)施例中,由表達(dá)式處理器42使用的輸入數(shù)據(jù)結(jié)構(gòu)包括分析時(shí)表達(dá)式樹(shù)26、表達(dá)式列表36,以及模板列表38。表達(dá)式處理器42還可以生成并使用多個(gè)文檔處理器結(jié)構(gòu)39(具體來(lái)說(shuō),/堆棧39C、//堆棧39D、指針(Ptr)堆棧39E,以及屬性(Attr)堆棧39F)。表達(dá)式處理器42可以向轉(zhuǎn)換引擎44輸出模板/表達(dá)式匹配列表39G。
一般而言,表達(dá)式處理器42從分析器電路40接收事件,并將其中標(biāo)識(shí)的文檔節(jié)點(diǎn)與分析時(shí)表達(dá)式樹(shù)26中的表達(dá)式節(jié)點(diǎn)進(jìn)行匹配。在對(duì)文檔節(jié)點(diǎn)進(jìn)行分析時(shí)內(nèi)聯(lián)地接收它們。如此,在任何給定的時(shí)間點(diǎn),以前接收到的文檔節(jié)點(diǎn)可以具有與分析時(shí)表達(dá)式樹(shù)匹配的部分,但是還沒(méi)有到達(dá)樹(shù)的葉部分(其中,整個(gè)表達(dá)式已經(jīng)與由分析器電路40提供的一組文檔節(jié)點(diǎn)匹配)。表達(dá)式處理器42可以使用堆棧39C-39F來(lái)存儲(chǔ)分析時(shí)表達(dá)式樹(shù)26的已經(jīng)匹配了前面的文檔節(jié)點(diǎn)的那一部分,有效地保留了分析時(shí)表達(dá)式樹(shù)26中的下一個(gè)文檔節(jié)點(diǎn)可以與其進(jìn)行比較的位置。
所說(shuō)明的實(shí)施例可以用于XPath表達(dá)式,其中,節(jié)點(diǎn)之間的運(yùn)算符可以包括父/子運(yùn)算符(″/″)和后代/祖先運(yùn)算符(″//″)。如此,給定表達(dá)式節(jié)點(diǎn)可以具有一個(gè)或多個(gè)/子和一個(gè)或多個(gè)//子。如果給定表達(dá)式節(jié)點(diǎn)具有/子并與一個(gè)文檔節(jié)點(diǎn)匹配,則該給定表達(dá)式節(jié)點(diǎn)可以被推到/堆棧39C上。類似地,如果給定表達(dá)式節(jié)點(diǎn)具有//子并與一個(gè)文檔節(jié)點(diǎn)匹配,則該給定表達(dá)式節(jié)點(diǎn)可以被推到//堆棧39D上。如果文檔節(jié)點(diǎn)是屬性,則該屬性可以存儲(chǔ)在Attr堆棧39F上。在一些實(shí)施例中,在開(kāi)始處理事件時(shí),保存了棧頂指針,以便可以恢復(fù)處理事件之前的堆棧狀態(tài)。Ptr堆棧39E可以用來(lái)存儲(chǔ)指針。
在其中在表達(dá)式處理器42中部分地對(duì)具有運(yùn)行時(shí)部分的表達(dá)式進(jìn)行求值的實(shí)施例中,在匹配列表39G中可以保留關(guān)于運(yùn)行時(shí)部分的信息,以便可以執(zhí)行運(yùn)行時(shí)求值,并可以丟棄匹配列表39G中的不滿足表達(dá)式的運(yùn)行時(shí)部分的文檔節(jié)點(diǎn)。如此,可以則表達(dá)式的具有運(yùn)行時(shí)求值的每一個(gè)部分將匹配列表39G分組。具有由運(yùn)行時(shí)部分使用的相同值的每一個(gè)文檔節(jié)點(diǎn)都可以包括在給定組中。
如圖9所示,匹配列表39G可以包括構(gòu)成表達(dá)式的節(jié)點(diǎn)集的文檔節(jié)點(diǎn)的組的分層陣列。對(duì)于分析時(shí)表達(dá)式樹(shù)中的每一個(gè)表達(dá)式,都可以有這樣的結(jié)構(gòu)(即,圖9所示的結(jié)構(gòu)可以對(duì)應(yīng)于一個(gè)表達(dá)式)。主要組(例如,圖9中的PG0和PG1)可以對(duì)應(yīng)于分析時(shí)表達(dá)式樹(shù)中的頂級(jí)節(jié)點(diǎn),對(duì)于匹配了頂級(jí)節(jié)點(diǎn)并且要么本身是節(jié)點(diǎn)集的成員,要么具有作為節(jié)點(diǎn)集的成員的后代的每一個(gè)不同的文檔節(jié)點(diǎn),可以有不同的主要組。每一個(gè)分組級(jí)都可以對(duì)應(yīng)于運(yùn)行時(shí)求值(例如,在一個(gè)實(shí)施例中,運(yùn)行時(shí)謂詞)??梢员A粲糜谶\(yùn)行時(shí)謂詞的值以及指向下一分組級(jí)別的指針(或指向節(jié)點(diǎn)列表本身的指針)。當(dāng)出現(xiàn)表達(dá)式的匹配時(shí),基于節(jié)點(diǎn)的分組級(jí)的值,節(jié)點(diǎn)被放置在組中。即,在給定級(jí)別,節(jié)點(diǎn)或者包括在其值匹配子組的子組中,或者,為節(jié)點(diǎn)創(chuàng)建新的子組。在所說(shuō)明的示例中,第一子組級(jí)別(對(duì)應(yīng)于第一運(yùn)行時(shí)謂詞)包括來(lái)自主要組0(PG0)的子組0和1(SG0和SG1)。類似地,主要組1(PG1)包括對(duì)應(yīng)于第一運(yùn)行時(shí)謂詞的子組SGM和SGM+1。第二運(yùn)行時(shí)謂詞對(duì)應(yīng)于第二子組級(jí)別,包括SGN和SGN+1作為子組SG0的子組。在此示例中,在表達(dá)式中有兩個(gè)運(yùn)行時(shí)謂詞,如此,子組SGN和SGN+1兩者都指向潛在地匹配文檔節(jié)點(diǎn)的列表(例如,在所說(shuō)明的示例中,節(jié)點(diǎn)N0、N1,以及N2)。在一個(gè)實(shí)施例中,可以在匹配列表39G中通過(guò)如分析器40所分配的前綴次序編號(hào)來(lái)表示文檔節(jié)點(diǎn)。
通過(guò)使用分層結(jié)構(gòu),轉(zhuǎn)換引擎44可以選擇主要組,對(duì)第一運(yùn)行時(shí)謂詞進(jìn)行求值,將第一運(yùn)行時(shí)謂詞與主要組的每一個(gè)子組進(jìn)行比較(丟棄不滿足第一運(yùn)行時(shí)謂詞的任何子組)。轉(zhuǎn)換引擎44可以對(duì)第二運(yùn)行時(shí)謂詞進(jìn)行求值,將第二運(yùn)行時(shí)謂詞與沒(méi)有被丟棄的第一級(jí)別子組的每一個(gè)子組進(jìn)行比較,并丟棄不滿足第二運(yùn)行時(shí)謂詞的子組等等。在對(duì)每一個(gè)運(yùn)行時(shí)謂詞進(jìn)行求值之后仍保留在結(jié)構(gòu)中的節(jié)點(diǎn)是滿足對(duì)應(yīng)的表達(dá)式的節(jié)點(diǎn)集。轉(zhuǎn)換引擎44可以在指令表30中查詢對(duì)應(yīng)于表達(dá)式的指令,并對(duì)節(jié)點(diǎn)集中的每一個(gè)節(jié)點(diǎn)執(zhí)行這些指令。
在一個(gè)實(shí)施例中,如果分析時(shí)表達(dá)式樹(shù)26中的第一表達(dá)式是第二表達(dá)式的后綴(即,第二表達(dá)式包括未包括在第一表達(dá)式中的前綴,但是,第一表達(dá)式的整體與第二表達(dá)式的結(jié)尾相同),那么,可以不必為第一表達(dá)式創(chuàng)建單獨(dú)的匹配列表39G。相反,將創(chuàng)建第二表達(dá)式的匹配列表39G,并包括第一表達(dá)式的頂級(jí)節(jié)點(diǎn)的分組。對(duì)應(yīng)于第一表達(dá)式的指針可以指向第二表達(dá)式的匹配列表39G內(nèi)的第一表達(dá)式的頂級(jí)節(jié)點(diǎn)的分組。
在一個(gè)實(shí)施例中,匹配了給定表達(dá)式的節(jié)點(diǎn)本身可以由對(duì)應(yīng)的模板正文進(jìn)行操縱,或者可以操縱節(jié)點(diǎn)的值(例如,屬性值或元素的內(nèi)容)。對(duì)于分析時(shí)表達(dá)式樹(shù)26中的每一個(gè)葉節(jié)點(diǎn),樣式表編譯器20可以被配置為指出是否需要節(jié)點(diǎn)或節(jié)點(diǎn)的值。在一些實(shí)施例中,對(duì)于每一個(gè)節(jié)點(diǎn),表達(dá)式處理器42還可以輸出節(jié)點(diǎn)所匹配的模板的列表。
表達(dá)式列表36可以是樣式表中包括的表達(dá)式的列表。樣式表編譯器可以向表達(dá)式分配表達(dá)式編號(hào),并可以將表達(dá)式編號(hào)存儲(chǔ)在表達(dá)式列表中。分析時(shí)表達(dá)式樹(shù)葉節(jié)點(diǎn)中的指針可以指向表達(dá)式列表中的條目。每一個(gè)條目都可以表達(dá)式編號(hào)和指出了需要分組的表達(dá)式樹(shù)的級(jí)別的組簽名。例如,在一個(gè)實(shí)施例中,組簽名可以包括表達(dá)式樹(shù)的每一個(gè)級(jí)別的位,0表示在該級(jí)別沒(méi)有分組,1表示有分組。在一些實(shí)施例中,可以有一個(gè)以上的表達(dá)式對(duì)應(yīng)于給定葉節(jié)點(diǎn)。例如,由于與另一個(gè)表達(dá)式匹配而被刪除的編譯時(shí)表達(dá)式可能導(dǎo)致兩個(gè)表達(dá)式都開(kāi)始被葉節(jié)點(diǎn)匹配。此外,給定樣式表還可以在一個(gè)以上的位置具有等效的表達(dá)式。對(duì)于這樣的實(shí)施例,匹配表達(dá)式編號(hào)的列表可以存儲(chǔ)在表達(dá)式列表36的連續(xù)的條目中,這些條目可以包括最后一個(gè)表達(dá)式指示,該指示可以標(biāo)識(shí)給定葉節(jié)點(diǎn)的最后一個(gè)匹配表達(dá)式。如果只有一個(gè)匹配表達(dá)式,則被表達(dá)式指針?biāo)赶虻牡谝粭l目中的最后一個(gè)表達(dá)式指示可以讓其最后一個(gè)條目指示處于指出了最后一個(gè)條目的狀態(tài)。
模板列表38可以類似地包括具有模板編號(hào)和最后一個(gè)模板指示的條目,以允許給定葉節(jié)點(diǎn)有多個(gè)匹配模板。分析時(shí)表達(dá)式樹(shù)36中的葉節(jié)點(diǎn)可以類似地包括指向一個(gè)或多個(gè)匹配模板的模板列表的指針。模板列表38可以進(jìn)一步包括模板類型字段(例如,是否為被導(dǎo)入的,模板是否具有模數(shù),以及模板是否具有一個(gè)或多個(gè)運(yùn)行時(shí)謂詞)、模數(shù)、對(duì)于被導(dǎo)入的類型標(biāo)識(shí)從其導(dǎo)入了模板的樣式表的導(dǎo)入標(biāo)識(shí)符、指向標(biāo)識(shí)要為模板執(zhí)行的指令的指令表30的模板正文指令指針,指向標(biāo)識(shí)要執(zhí)行以對(duì)一個(gè)或多個(gè)運(yùn)行時(shí)謂詞進(jìn)行求值的指令的指令表30的謂詞指針。
圖10顯示了分析時(shí)表達(dá)式樹(shù)26數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例的方框圖。在所說(shuō)明的實(shí)施例中,分析時(shí)表達(dá)式樹(shù)可以包括具有諸如條目120之類的多個(gè)條目的表,每一個(gè)條目都對(duì)應(yīng)于表達(dá)式樹(shù)中的表達(dá)式節(jié)點(diǎn)。每一個(gè)表達(dá)式節(jié)點(diǎn)都節(jié)點(diǎn)可以具有最多此實(shí)施例中的三種不同類型的零個(gè)或多個(gè)子節(jié)點(diǎn)(1)/子節(jié)點(diǎn),它們是文檔樹(shù)中的節(jié)點(diǎn)的子節(jié)點(diǎn);(2)//子節(jié)點(diǎn),它們是文檔樹(shù)中的節(jié)點(diǎn)的后代(要么是直接子節(jié)點(diǎn),要么間接地通過(guò)一個(gè)或多個(gè)節(jié)點(diǎn)的子樹(shù));或(3)屬性子節(jié)點(diǎn)(元素節(jié)點(diǎn)的屬性)。此外,給定表達(dá)式節(jié)點(diǎn)可以是頂級(jí)節(jié)點(diǎn),也可以不是頂級(jí)節(jié)點(diǎn)。在一個(gè)實(shí)施例中,分析時(shí)表達(dá)式樹(shù)26可以包括多個(gè)樹(shù)構(gòu)成的“林”,每一個(gè)樹(shù)都具有根。頂級(jí)節(jié)點(diǎn)是其中一個(gè)樹(shù)的根,樹(shù)可以表示以頂級(jí)節(jié)點(diǎn)開(kāi)始的一個(gè)或多個(gè)表達(dá)式。頂級(jí)節(jié)點(diǎn)可以分組在分析時(shí)表達(dá)式樹(shù)數(shù)據(jù)結(jié)構(gòu)的頂部,具有指向下一級(jí)別中的節(jié)點(diǎn)的指針,如下面就參考條目120比較詳細(xì)地描述的。
下面將描述條目120的字段。條目120包括用于頂級(jí)表達(dá)式節(jié)點(diǎn)的頂級(jí)類型(TLT)字段。頂級(jí)類型可以作為相對(duì)、絕對(duì)或祖先來(lái)編碼。相對(duì)頂級(jí)節(jié)點(diǎn)是開(kāi)始了相對(duì)于文檔樹(shù)中的上下文節(jié)點(diǎn)求值的一個(gè)或多個(gè)表達(dá)式的表達(dá)式節(jié)點(diǎn),而絕對(duì)頂級(jí)節(jié)點(diǎn)是開(kāi)始了從文檔樹(shù)的根節(jié)點(diǎn)求值的一個(gè)或多個(gè)表達(dá)式的表達(dá)式節(jié)點(diǎn)(即,一個(gè)或多個(gè)表達(dá)式以/開(kāi)始,后面是頂級(jí)節(jié)點(diǎn)標(biāo)識(shí)符)。祖先頂級(jí)節(jié)點(diǎn)是引用了上下文節(jié)點(diǎn)的祖先的表達(dá)式的開(kāi)始(即,一個(gè)表達(dá)式或表達(dá)式以//開(kāi)始,后面是頂級(jí)節(jié)點(diǎn)標(biāo)識(shí)符)。
條目120包括存儲(chǔ)了表達(dá)式節(jié)點(diǎn)的序列號(hào)的序列號(hào)(S/N)字段。將S/N與由分析器電路40傳輸?shù)氖录袠?biāo)識(shí)的文檔節(jié)點(diǎn)的序列號(hào)進(jìn)行比較,以檢測(cè)存儲(chǔ)在條目120中的表達(dá)式節(jié)點(diǎn)上存在匹配(序列號(hào)相等)或不匹配。條目120進(jìn)一步包括葉節(jié)點(diǎn)(LN)字段,該字段標(biāo)識(shí)存儲(chǔ)在條目120中的表達(dá)式節(jié)點(diǎn)是否為葉節(jié)點(diǎn)(即,是否已經(jīng)到達(dá)表達(dá)式的結(jié)尾)。葉節(jié)點(diǎn)上的匹配使文檔節(jié)點(diǎn)記錄在對(duì)應(yīng)于葉節(jié)點(diǎn)的每一個(gè)表達(dá)式/模板的匹配列表39G中。LN字段可以是位指示,當(dāng)設(shè)置時(shí),表達(dá)式節(jié)點(diǎn)是葉節(jié)點(diǎn)和指示,當(dāng)清除時(shí),表達(dá)式節(jié)點(diǎn)不是葉節(jié)點(diǎn)。其他實(shí)施例可以顛倒位的設(shè)置和清除含義或使用其他編碼。
路徑類型字段可以標(biāo)識(shí)來(lái)自存儲(chǔ)在條目120中的表達(dá)式節(jié)點(diǎn)的路徑鏈接的類型(例如,要么/,//,要么兩者)。例如,路徑類型字段可以包括每一種類型的位,可以設(shè)置該位,以表示路徑的類型是從此節(jié)點(diǎn)發(fā)生的,并可以清除,以表示路徑的類型不存在。其他實(shí)施例可以顛倒位的設(shè)置和清除含義或使用其他編碼。路徑類型字段可以使“Ptr/”和“Ptr//”字段生效。Ptr/字段可以存儲(chǔ)指向表達(dá)式節(jié)點(diǎn)的第一/子的指針(每一個(gè)/子都可以分組在分析時(shí)表達(dá)式樹(shù)數(shù)據(jù)結(jié)構(gòu)的連續(xù)的條目中,從Ptr/指針表示的條目開(kāi)始)。類似地,Ptr//字段可以存儲(chǔ)指向表達(dá)式節(jié)點(diǎn)的第一//子的指針(每一個(gè)//子都可以分組在分析時(shí)表達(dá)式樹(shù)數(shù)據(jù)結(jié)構(gòu)的連續(xù)的條目中,從Ptr//指針表示的條目開(kāi)始)。Ptr Attr字段可以存儲(chǔ)指向分析時(shí)表達(dá)式節(jié)點(diǎn)的第一屬性節(jié)點(diǎn)的指針(每一個(gè)屬性都可以分組在分析時(shí)表達(dá)式樹(shù)數(shù)據(jù)結(jié)構(gòu)的連續(xù)的條目中,從Ptr Attr指針表示的條目開(kāi)始)。
EOL字段存儲(chǔ)了關(guān)于條目120是否存儲(chǔ)了作為當(dāng)前樹(shù)級(jí)的結(jié)尾的表達(dá)式節(jié)點(diǎn)的指示。例如,從指出級(jí)別結(jié)尾的分析時(shí)表達(dá)式樹(shù)數(shù)據(jù)結(jié)構(gòu)的頂部的第一條目可以表示最后一個(gè)頂級(jí)節(jié)點(diǎn)。從每一個(gè)指針開(kāi)始(例如,Ptr/、Ptr//或Ptr Attr),條目是包含指針的條目的子,直到到達(dá)具有EOL字段的指出了級(jí)別結(jié)尾的條目。EOL字段可以是位指示,當(dāng)設(shè)置時(shí),表達(dá)式節(jié)點(diǎn)是級(jí)別的結(jié)尾和指示,當(dāng)清除時(shí),表達(dá)式節(jié)點(diǎn)不是級(jí)別的結(jié)尾。其他實(shí)施例可以顛倒位的設(shè)置和清除含義或使用其他編碼。
如上所述,條目120進(jìn)一步包括存儲(chǔ)了指向表達(dá)式列表36中的條目的表達(dá)式列表指針的表達(dá)式列表指針(XLP)字段,存儲(chǔ)了指向模板列表38中的條目的模板列表指針的模板列表指針(TLP)字段。XLP和TLP字段可以對(duì)葉節(jié)點(diǎn)有效。
在本實(shí)施例中,一些謂詞在分析時(shí)可以是可求值的,可以使用謂詞類型(PrTP)字段和謂詞數(shù)據(jù)(PrDT)字段來(lái)表示這樣的謂詞。例如,可以對(duì)謂詞類型字段進(jìn)行編碼,以表示沒(méi)有可求值的謂詞、位置謂詞或?qū)傩悦Q謂詞。謂詞數(shù)據(jù)字段可以存儲(chǔ)來(lái)自表達(dá)式的謂詞數(shù)據(jù)(例如,位置謂詞的位置號(hào)碼,或?qū)τ趯傩悦Q謂詞,屬性名稱或?qū)傩悦Q的序列號(hào))。
圖11是示范性表達(dá)式樹(shù)122和對(duì)應(yīng)于表達(dá)式樹(shù)122的分析時(shí)表達(dá)式樹(shù)條目120A-120E的對(duì)應(yīng)的部分的方框圖。表達(dá)式樹(shù)122包括序列號(hào)為10的表達(dá)式節(jié)點(diǎn)124A,該表達(dá)式節(jié)點(diǎn)124A具有兩個(gè)/子節(jié)點(diǎn)124B和124C(序列號(hào)為15和20),一個(gè)//子節(jié)點(diǎn)124D(序列號(hào)25),以及一個(gè)屬性子124E(序列號(hào)30)。如此,表達(dá)式樹(shù)122表示下列表達(dá)式(假設(shè)節(jié)點(diǎn)124A是相對(duì)頂級(jí)節(jié)點(diǎn))10/15、10/20、10//25,以及10/attribute::30。
條目120A-120E說(shuō)明了分析時(shí)表達(dá)式樹(shù)條目的S/N、LN、EOL、Ptr/、Ptr//、以及Ptr Attr字段。條目120A對(duì)應(yīng)于節(jié)點(diǎn)124A,如此包括序列號(hào)10。節(jié)點(diǎn)124A不是葉節(jié)點(diǎn),如此,在條目120A中LN字段為零。對(duì)于此示例,EOL字段為1,因?yàn)楣?jié)點(diǎn)124A是樹(shù)122中的其級(jí)別中的唯一節(jié)點(diǎn)。條目120A的Ptr/字段指向條目120B(第一/子)。條目120A的Ptr//字段指向條目120D,條目120A的Ptr Attr字段指向條目120E。
條目120B包括S/N字段中的15,LN字段為1,因?yàn)楣?jié)點(diǎn)124B是表達(dá)式樹(shù)122的葉節(jié)點(diǎn)。然而,EOL字段是0,因?yàn)樵诖思?jí)別有另一個(gè)/子。條目120B的Ptr/、Ptr//,以及Ptr Attr字段是空值,因?yàn)檫@是葉節(jié)點(diǎn)。條目120C包括S/N字段中的20,LN字段為1,因?yàn)楣?jié)點(diǎn)124C是表達(dá)式樹(shù)122的葉節(jié)點(diǎn)。EOL字段也是1,因?yàn)楣?jié)點(diǎn)124C是此級(jí)別中的最后一個(gè)/子。再者,由于條目120C是葉節(jié)點(diǎn),因此,條目120C的Ptr/、Ptr//,以及Ptr Attr字段是空值。
條目120D包括S/N字段中的25,LN字段為1,因?yàn)楣?jié)點(diǎn)124D是表達(dá)式樹(shù)122的葉節(jié)點(diǎn)。EOL字段也是1,因?yàn)楣?jié)點(diǎn)124D是此級(jí)別中的最后一個(gè)//子。再者,由于條目120D是葉節(jié)點(diǎn),因此,條目120D的Ptr/、Ptr//,以及Ptr Attr字段是空值。
條目120E包括S/N字段中的30,LN字段為1,因?yàn)楣?jié)點(diǎn)124E是表達(dá)式樹(shù)122的葉節(jié)點(diǎn)。EOL字段是1,因?yàn)楣?jié)點(diǎn)124E是此級(jí)別中的最后一個(gè)屬性子節(jié)點(diǎn)。再者,由于條目120E是葉節(jié)點(diǎn),因此,條目120E的Ptr/、Ptr//,以及Ptr Attr字段是空值。
下面請(qǐng)參考圖12A-12B、13、14A-14B,以及15,顯示了流程圖,這些流程圖說(shuō)明了表達(dá)式處理器42對(duì)于可以由分析器電路40生成的每一個(gè)事件的操作的一個(gè)實(shí)施例。每一個(gè)事件都可以包括已經(jīng)檢測(cè)到的文檔節(jié)點(diǎn)的序列號(hào)(以及,在一些實(shí)施例中,還有文檔節(jié)點(diǎn)的前綴次序編號(hào))。表達(dá)式處理器44可以以硬件方式實(shí)現(xiàn),如此,流程圖可以表示硬件的操作,即使各個(gè)方框可以以硬件并行地執(zhí)行或依照要求以硬件將其流水線化。流程圖可以一般引用匹配文檔節(jié)點(diǎn)和表達(dá)式節(jié)點(diǎn)。如前面所述,這樣的匹配可以包括文檔節(jié)點(diǎn)和表達(dá)式節(jié)點(diǎn)的匹配序列號(hào)。此外,流程圖可以引用將節(jié)點(diǎn)輸出到匹配列表。在一些實(shí)施例中,如前面所述,節(jié)點(diǎn)可以通過(guò)前綴次序編號(hào)在匹配列表中表示。
圖12A-12B是說(shuō)明了響應(yīng)元素開(kāi)始事件的表達(dá)式處理器42的一個(gè)實(shí)施例的操作的流程圖??梢皂憫?yīng)檢測(cè)到文檔中的元素開(kāi)始標(biāo)記來(lái)傳輸元素開(kāi)始事件。
表達(dá)式處理器42可以彈出存儲(chǔ)在/堆棧39C中的任何屬性表達(dá)式節(jié)點(diǎn),并可以將/堆棧指針推到指針堆棧39E(方框130)。由于新的元素正在啟動(dòng),/堆棧上的任何屬性表達(dá)式節(jié)點(diǎn)都將不會(huì)被匹配,因而,也不被需要。如果由元素啟動(dòng)事件標(biāo)識(shí)的元素(在圖12A-12B的描述中簡(jiǎn)稱為“元素”)是文檔的根節(jié)點(diǎn),那么,不需要執(zhí)行其他處理(判斷方框132,“是”支線)。根節(jié)點(diǎn)可以不匹配分析時(shí)表達(dá)式樹(shù)26中的任何節(jié)點(diǎn),任何頂級(jí)節(jié)點(diǎn)都可以匹配根的子。如果元素不是根節(jié)點(diǎn)(判斷方框132,“否”支線),但元素的父是根節(jié)點(diǎn)(判斷方框134,“是”支線),表達(dá)式處理器42可以檢查分析時(shí)表達(dá)式樹(shù)26中的每一個(gè)頂級(jí)表達(dá)式節(jié)點(diǎn),因?yàn)樯踔量梢詸z測(cè)到與根節(jié)點(diǎn)的子的絕對(duì)頂級(jí)節(jié)點(diǎn)的匹配(方框136)。另一方面,如果元素節(jié)點(diǎn)的父元素是根節(jié)點(diǎn)(判斷方框134,“否”支線),則表達(dá)式處理器42可以檢查分析時(shí)表達(dá)式樹(shù)26中的每一個(gè)相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn),因?yàn)榭赡軝z測(cè)不到與不是根節(jié)點(diǎn)的子的節(jié)點(diǎn)的絕對(duì)頂級(jí)節(jié)點(diǎn)的匹配。
如果對(duì)照任何頂級(jí)節(jié)點(diǎn)沒(méi)有檢測(cè)到匹配(判斷方框140,“否”支線),則流程圖在圖12B中的參考點(diǎn)A處繼續(xù)。如果檢測(cè)到匹配(判斷方框140,“是”支線),并且表達(dá)式節(jié)點(diǎn)是葉節(jié)點(diǎn)(判斷方框142,“是”支線),則元素節(jié)點(diǎn)被輸出到對(duì)應(yīng)于由分析時(shí)表達(dá)式樹(shù)26的表達(dá)式節(jié)點(diǎn)的條目中的XLP和TLP指針?biāo)赶虻谋磉_(dá)式和/或模板的匹配列表(方框144)。如果被匹配的表達(dá)式節(jié)點(diǎn)不是葉節(jié)點(diǎn)(判斷方框142,“否”支線),則表達(dá)式處理器42判斷被匹配的表達(dá)式節(jié)點(diǎn)是否具有任何/或//子(分別為判斷方框146和148),如果被匹配的表達(dá)式節(jié)點(diǎn)具有任何/或//子(分別為方框150和152),則將被匹配的表達(dá)式節(jié)點(diǎn)分別推到/堆棧39C和/或//堆棧39D上。此外,/堆棧39C和//堆棧39D可以包括用于管理分析時(shí)謂詞的匹配的被求值字段(通過(guò)分析時(shí)表達(dá)式樹(shù)條目中的PrTP和PrDT字段指出)。如果有分析時(shí)謂詞(通過(guò)PrTP字段來(lái)表示),被求值字段可以被設(shè)置為0。否則,被求值的字段可以被設(shè)置為2。流程圖在圖12B中的參考點(diǎn)A處繼續(xù)。
在圖12B中的參考點(diǎn)A處,取決于這次通過(guò)流程圖是否為針對(duì)此元素的對(duì)/堆棧39C的第一次檢查(判斷方框154),流程圖會(huì)以不同的方式進(jìn)行操作。如果這是針對(duì)此元素的對(duì)/堆棧39C的第一次檢查(判斷方框154,“是”支線),則表達(dá)式處理器42判斷元素的父是/堆棧39C中的匹配(判斷方框156)。如果元素的父是/堆棧39C中的匹配(判斷方框156,“是”支線),那么,被匹配的表達(dá)式節(jié)點(diǎn)的其中一個(gè)/子可以匹配該元素。表達(dá)式處理器42可以獲取如被匹配的表達(dá)式節(jié)點(diǎn)的分析時(shí)表達(dá)式樹(shù)條目中的Ptr/所示的被匹配的表達(dá)式節(jié)點(diǎn)的第一/子(方框158),并可以返回到圖12A中的參考點(diǎn)B處,以判斷是否在/子上檢測(cè)到匹配(如果檢測(cè)到匹配,則進(jìn)行圖12A中的方框142-152所示的處理)。如果元素的父不是/堆棧中的匹配(判斷方框156,“否”支線),則表達(dá)式處理器42可以檢查//堆棧39D(方框160)。類似地,如果此次通過(guò)不是此元素的/堆棧39C的第一次檢查(判斷方框154,“否”支線),并且已經(jīng)從/堆棧中的被匹配的表達(dá)式節(jié)點(diǎn)獲取了最后一個(gè)/子(判斷方框162,“是”支線),則表達(dá)式處理器42可以檢查//堆棧39D(方框160)。如果此次通過(guò)不是此元素的/堆棧39C的第一次檢查(判斷方框154,“否”支線),并且還沒(méi)有從/堆棧中的被匹配的表達(dá)式節(jié)點(diǎn)中獲取最后一個(gè)/子(判斷方框162,“否”支線),表達(dá)式處理器42可以獲取/堆棧中的被匹配的表達(dá)式節(jié)點(diǎn)的下一個(gè)/子,流程圖可以在圖12A中的參考點(diǎn)B處繼續(xù),以判斷是否檢測(cè)到該元素的匹配。如此,通過(guò)方框154-164的操作(并返回到圖12A中的方框140-152),可以搜索表達(dá)式節(jié)點(diǎn)的匹配元素的父的每一個(gè)/子,以查找元素的匹配。
在一些實(shí)施例中,可以由表達(dá)式處理器42維護(hù)一個(gè)元素的父元素(例如,表達(dá)式處理器42可以保留一疊其元素開(kāi)始事件已經(jīng)產(chǎn)生,而其元素結(jié)束事件還沒(méi)有產(chǎn)生的元素)?;蛘撸谄渌麑?shí)施例中,可以由分析器電路40來(lái)維護(hù)父元素,也可以包括在元素開(kāi)始事件中。
在本實(shí)施例中,對(duì)//堆棧39D進(jìn)行搜索的過(guò)程與搜索/堆棧39C的過(guò)程稍微有點(diǎn)不同。一個(gè)節(jié)點(diǎn)可以匹配//堆棧39D上的任何表達(dá)式節(jié)點(diǎn)的//子(因?yàn)?/運(yùn)算符選擇表達(dá)式節(jié)點(diǎn)的任何后代,//堆棧39D上的條目已經(jīng)匹配了前面的元素,該元素是元素開(kāi)始事件中標(biāo)識(shí)的元素的父或祖先)。如此,圖12B的流程圖說(shuō)明了搜索//堆棧39D上的每一個(gè)有效條目的//子的過(guò)程。
如果//堆棧39D沒(méi)有有效的條目(或者再也沒(méi)有有效條目)(判斷方框166,“否”支線),則//堆棧處理完成,對(duì)元素開(kāi)始事件的處理也完成。如果//堆棧39D具有有效條目(判斷方框166,“是“支線),則表達(dá)式處理器42獲取該條目的第一//,如條目中的Ptr//所示(方框168)。表達(dá)式處理器42將//子與元素進(jìn)行比較,以判斷是否檢測(cè)到匹配(判斷方框170)。如果檢測(cè)到匹配(判斷方框170,“是”支線),并且//子節(jié)點(diǎn)是葉節(jié)點(diǎn)(判斷方框172,“是”支線),則類似于方框144,將元素輸出到匹配列表(方框174)。類似于方框146-152,如果//子節(jié)點(diǎn)不是葉節(jié)點(diǎn),并且檢測(cè)到匹配,則表達(dá)式處理器42判斷//子節(jié)點(diǎn)是否具有任何/或//子本身(分別為判斷方框176和178),并如果//子節(jié)點(diǎn)具有任何/或//子(分別為方框180和182),則將//子節(jié)點(diǎn)分別推到/堆棧39C和/或//堆棧39D。此外,/或//堆棧39C-39D中的被求值的字段可以按照上文參考方框146-152所述的那樣進(jìn)行設(shè)置。
如果還沒(méi)有處理當(dāng)前//堆棧條目的最后一個(gè)子(判斷方框184,“否”支線),則表達(dá)式處理器42獲取當(dāng)前//堆棧條目的下一個(gè)//子(方框186),流程圖在判斷方框170處對(duì)下一個(gè)//子繼續(xù)執(zhí)行。如果已經(jīng)處理了最后一個(gè)子(判斷方框184,“是”支線),表達(dá)式處理器42轉(zhuǎn)到//堆棧39D中的下一條目(方框188),流程圖在判斷方框166對(duì)下一//堆棧條目繼續(xù)執(zhí)行。
圖13說(shuō)明了響應(yīng)元素結(jié)束事件的表達(dá)式處理器42的一個(gè)實(shí)施例的操作。分析器電路40響應(yīng)檢測(cè)到文檔中的元素結(jié)束標(biāo)記來(lái)傳輸元素結(jié)束事件。
如果元素結(jié)束事件是針對(duì)文檔的根節(jié)點(diǎn)的(判斷方框190,“是”支線),則文檔是完整的(方框192)。表達(dá)式處理器42可以清除堆棧39C-39F。如果元素結(jié)束事件不是針對(duì)文檔的根節(jié)點(diǎn)的(判斷方框190,“否”支線),則表達(dá)式處理器42可以彈出對(duì)應(yīng)于結(jié)束元素的/和//堆棧條目(方框194)。由于元素正在關(guān)閉,元素的所有子元素以前都已經(jīng)被分析。相應(yīng)地,/和//堆棧中的對(duì)應(yīng)于元素的任何條目(即,具有元素的序列號(hào)的條目)不能被隨后檢測(cè)到的節(jié)點(diǎn)匹配。
圖14A-14B說(shuō)明了響應(yīng)屬性名稱事件的表達(dá)式處理器42的一個(gè)實(shí)施例的操作。分析器電路40響應(yīng)檢測(cè)到文檔中的元素開(kāi)始標(biāo)記內(nèi)的屬性名稱來(lái)傳輸屬性名稱事件。屬性名稱可以通過(guò)其序列號(hào)來(lái)表示。
表達(dá)式處理器42可以將屬性名稱(即,其序列號(hào))推到Attr堆棧39F。Attr堆棧39F累積用于進(jìn)行元素關(guān)閉命令處理的屬性名稱(圖15)。如果屬性的父節(jié)點(diǎn)是根節(jié)點(diǎn)(判斷方框202,“是”支線),那么,不需要執(zhí)行其他處理(因?yàn)楦?jié)點(diǎn)沒(méi)有屬性)。另一方面,如果屬性的父節(jié)點(diǎn)不是根節(jié)點(diǎn)(判斷方框202,“否”支線),則表達(dá)式處理器42繼續(xù)。
表達(dá)式處理器42可以檢查每一個(gè)相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn),以查找與屬性名稱的匹配(也是通過(guò)序列號(hào)來(lái)匹配)(方框204)。如果不存在與給定相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn)的匹配(判斷方框206,“否”支線),則繼續(xù)對(duì)下一相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn)進(jìn)行處理,直到頂級(jí)表達(dá)式節(jié)點(diǎn)耗盡(判斷方框208,“否”支線)。一旦耗盡了頂級(jí)表達(dá)式節(jié)點(diǎn)(判斷方框208,“是”支線),處理在圖14B中的參考點(diǎn)C處繼續(xù)。
如果檢測(cè)到匹配(判斷方框206,“是”支線),并且節(jié)點(diǎn)是葉節(jié)點(diǎn)(判斷方框210,“是”支線),則屬性節(jié)點(diǎn)被輸出到匹配列表39G(方框210)。表達(dá)式處理器42判斷匹配的表達(dá)式節(jié)點(diǎn)是否具有任何/或//子(分別為判斷方框212和214),如果匹配的表達(dá)式節(jié)點(diǎn)具有任何/或//子(分別為方框216和218),則將匹配的表達(dá)式節(jié)點(diǎn)分別推到/堆棧39C和/或//堆棧39D。
在圖14B中的參考點(diǎn)C處繼續(xù),表達(dá)式處理器42檢查是否有/或//堆棧39C-39D中的屬性名稱的父節(jié)點(diǎn)的匹配(判斷方框220)。如果沒(méi)有檢測(cè)到匹配(判斷方框220,“否”支線),則屬性名稱事件的處理完成。如果檢測(cè)到匹配,表達(dá)式處理器42檢查匹配表達(dá)式節(jié)點(diǎn)表達(dá)式樹(shù)條目的PrTP字段,以判斷匹配表達(dá)式節(jié)點(diǎn)是否具有屬性名稱謂詞(或在一個(gè)實(shí)施例中,預(yù)留的編碼)。如果匹配表達(dá)式節(jié)點(diǎn)具有屬性名稱謂詞,被求值的字段的最低有效位是清楚的(即,被求值的字段是0或2)(判斷方框222,“是”支線),表達(dá)式處理器42可以將屬性名稱與匹配表達(dá)式節(jié)點(diǎn)的表達(dá)式樹(shù)條目的PrDT字段進(jìn)行比較。如果屬性不匹配(判斷方框224,“否”支線),表達(dá)式處理器42對(duì)/或//堆棧39C-39D中的下一匹配節(jié)點(diǎn)(如果有的話)繼續(xù)執(zhí)行。如果屬性確實(shí)匹配(判斷方框224,“是”支線),則在一個(gè)實(shí)施例中,表達(dá)式處理器42進(jìn)行檢查,以查看PrTP字段是否具有預(yù)留的編碼(判斷方框226)。在其他實(shí)施例中,可以取消判斷方框226。如果PrTP字段具有預(yù)留的編碼(判斷方框226,“是”支線),則表達(dá)式處理器42可以為/或//堆棧39C-39D中的匹配表達(dá)式節(jié)點(diǎn)的被求值的字段的置位1(方框228)。如果PrTP字段沒(méi)有預(yù)留的編碼(判斷方框226,“否”支線),則表達(dá)式處理器42可以將被求值的字段設(shè)置為3(方框230)。不論是哪一種情況,對(duì)屬性名稱事件的處理可以完成。如果表達(dá)式處理器42試圖執(zhí)行屬性值匹配,則在一些實(shí)施例中,可以使用預(yù)留的編碼。其他實(shí)施例可以不必執(zhí)行這樣的匹配,在這樣的實(shí)施例中,可以取消方框226和228。
如果判斷方框222后面跟“否”支線,則表達(dá)式處理器42判斷PrTP字段是否指出無(wú)分析時(shí)謂詞或位置謂詞(判斷方框232)。即,表達(dá)式處理器42判斷PrTP字段是否指出屬性名稱。如果PrTP字段沒(méi)有被編碼到“無(wú)”或“位置”(判斷方框232,“否”支線),則表達(dá)式處理器42要么移到下一匹配/或//堆棧條目,要么,如果沒(méi)有更多匹配條目,則結(jié)束處理(判斷方框234,分別為“是”和“否”支線)。如果PrTP字段被編碼為“無(wú)”或“位置”,則表達(dá)式處理器42判斷表達(dá)式節(jié)點(diǎn)是否具有屬性子節(jié)點(diǎn)(判斷方框236)。如果表達(dá)式節(jié)點(diǎn)沒(méi)有屬性子節(jié)點(diǎn)(判斷方框236,“否”支線),表達(dá)式處理器42要么移到下一匹配/或//堆棧條目,要么,如果沒(méi)有更多匹配條目,則結(jié)束處理(判斷方框234,分別為“是”和“否”支線)。如果表達(dá)式節(jié)點(diǎn)確實(shí)具有屬性子節(jié)點(diǎn)(判斷序列號(hào)236,“是”支線),則表達(dá)式處理器42獲取該屬性子節(jié)點(diǎn)(方框238),并將屬性子節(jié)點(diǎn)與屬性名稱(序列號(hào))進(jìn)行比較。如果屬性子節(jié)點(diǎn)匹配屬性名稱(方框240,“是”支線),并且屬性子節(jié)點(diǎn)是葉節(jié)點(diǎn)(判斷方框242,“是”支線),則表達(dá)式處理器42將屬性名稱節(jié)點(diǎn)輸出到匹配列表39G。不管是否檢測(cè)到屬性匹配,如果有更多的屬性子節(jié)點(diǎn)(即,屬性子節(jié)點(diǎn)的EOL指示沒(méi)有指出級(jí)別的結(jié)尾),那么,表達(dá)式處理器42獲取下一屬性子節(jié)點(diǎn)(方框238),并對(duì)方框240-244繼續(xù)(判斷方框246,“是”支線)。否則(判斷方框246,“否”支線),表達(dá)式處理器42要么移到下一匹配/或//堆棧條目,要么,如果沒(méi)有更多匹配條目,則結(jié)束處理(判斷方框234,分別為“是”和“否”支線)。
圖15說(shuō)明了響應(yīng)元素關(guān)閉事件的表達(dá)式處理器42的一個(gè)實(shí)施例的操作。分析器電路40響應(yīng)檢測(cè)到元素開(kāi)始標(biāo)記的關(guān)閉來(lái)傳輸元素結(jié)束事件(如此,對(duì)于此元素,在文檔中已經(jīng)檢測(cè)到元素的所有屬性)。響應(yīng)元素關(guān)閉事件,表達(dá)式處理器42對(duì)照/堆棧39C中的任何匹配節(jié)點(diǎn)的屬性子節(jié)點(diǎn)檢查由分析器電路40以前標(biāo)識(shí)的屬性名稱。
如果正在被關(guān)閉的元素的父節(jié)點(diǎn)是根節(jié)點(diǎn)(判斷方框250,“是”支線),那么,則不執(zhí)行其他處理。如果正在被關(guān)閉的元素的父節(jié)點(diǎn)不是根節(jié)點(diǎn)(判斷方框250,“否”支線),表達(dá)式處理器檢查/堆棧39C以查找具有指出了屬性名稱的PrTP字段的條目(方框252)。如果沒(méi)有查找到匹配條目(判斷方框254,“否”支線),則處理完成。如果查找到匹配條目(判斷方框254,“是”支線),并且匹配條目的被求值的字段不是3(判斷方框256,“否”支線),則處理也完成。如果查找到匹配條目(判斷方框254,“是”支線),并且匹配條目的被求值的字段是3(判斷方框256,“是”支線),則在方框258中繼續(xù)進(jìn)行處理。
表達(dá)式處理器42獲取匹配表達(dá)式節(jié)點(diǎn)的屬性子節(jié)點(diǎn)(方框258)。此外,表達(dá)式處理器42獲取屬性堆棧39F的屬性名稱(方框260)。表達(dá)式處理器42比較屬性名稱。如果檢測(cè)到匹配(判斷方框262,“是”支線),則屬性節(jié)點(diǎn)被輸出到匹配列表39G(方框264)。不論是哪一種情況,如果沒(méi)有到達(dá)屬性堆棧39F的結(jié)尾(判斷方框266,“否”支線),則在方框260中對(duì)于屬性堆棧39F中的下一屬性繼續(xù)進(jìn)行處理。如果已經(jīng)到達(dá)屬性堆棧39F的結(jié)尾(判斷方框266,“是”支線),并且還沒(méi)有處理匹配表達(dá)式節(jié)點(diǎn)的最后一個(gè)屬性子節(jié)點(diǎn)(判斷方框268,“否”支線),則在方框258中對(duì)匹配表達(dá)式節(jié)點(diǎn)的下一屬性子節(jié)點(diǎn)繼續(xù)進(jìn)行處理。如果已經(jīng)到達(dá)屬性堆棧39F的結(jié)尾(判斷方框266,“是”支線),并且已經(jīng)處理匹配表達(dá)式節(jié)點(diǎn)的最后一個(gè)屬性子節(jié)點(diǎn)(判斷方框268,“是”支線),則對(duì)元素關(guān)閉事件的處理完成。
值得注意的是,在圖12A-12B、13、14A-14B,以及15的描述中的各個(gè)點(diǎn),流程圖引用了將節(jié)點(diǎn)輸出到匹配列表39G。輸出節(jié)點(diǎn)的操作可以包括將節(jié)點(diǎn)插入到對(duì)應(yīng)于分析時(shí)表達(dá)式樹(shù)26中的匹配的葉節(jié)點(diǎn)的表達(dá)式/模板的節(jié)點(diǎn)集合結(jié)構(gòu)。輸出節(jié)點(diǎn)的操作還可以進(jìn)一步包括用如分析時(shí)表達(dá)式樹(shù)26的葉節(jié)點(diǎn)中的模板列表指針?biāo)甘镜哪0寰幪?hào)(或列表)來(lái)更新由分析器電路40生成的骨架樹(shù)。
值得注意的是,在上述各個(gè)點(diǎn),表達(dá)式節(jié)點(diǎn)可以被稱為被推到/堆棧39C或//堆棧39D中。將表達(dá)式節(jié)點(diǎn)推到堆棧39C-39D中的操作可以包括將節(jié)點(diǎn)的表達(dá)式樹(shù)條目120推到堆棧中(或用于進(jìn)行表達(dá)式匹配的表達(dá)式樹(shù)條目的一部分)。依照要求,條目中可以包括補(bǔ)充信息(例如,指出匹配的進(jìn)度的各種狀態(tài)變量,如被求值的字段)。
下面請(qǐng)參考圖16,顯示了一個(gè)流程圖,該流程圖說(shuō)明了轉(zhuǎn)換引擎44響應(yīng)接收到被分析的內(nèi)容表39B和文檔的匹配列表39G的情況的一個(gè)實(shí)施例的操作。轉(zhuǎn)換引擎44可以以硬件方式實(shí)現(xiàn),如此,流程圖可以表示硬件的操作,即使各個(gè)方框可以以硬件并行地執(zhí)行或依照要求以硬件將其流水線化。
對(duì)于每一個(gè)表達(dá)式,轉(zhuǎn)換引擎44可以對(duì)表達(dá)式的任何運(yùn)行時(shí)部分(例如,運(yùn)行時(shí)謂詞,在一個(gè)實(shí)施例中-方框270)進(jìn)行求值。例如,在一個(gè)實(shí)施例中,模板列表38中的指針可以指出指令表30中的將由轉(zhuǎn)換引擎44執(zhí)行的指令,以對(duì)運(yùn)行時(shí)謂詞進(jìn)行求值。在其他實(shí)施例中,可以以其他方式標(biāo)識(shí)運(yùn)行時(shí)謂詞(例如,類似于分析時(shí)表達(dá)式樹(shù)26的運(yùn)行時(shí)表達(dá)式樹(shù))。響應(yīng)運(yùn)行時(shí)謂詞求值,轉(zhuǎn)換引擎44可以從節(jié)點(diǎn)集合結(jié)構(gòu)中選擇滿足運(yùn)行時(shí)表達(dá)式的組(方框272)。轉(zhuǎn)換引擎44可以執(zhí)行來(lái)自指令表30中的對(duì)應(yīng)于表達(dá)式的指令(例如,可以由模板列表38中的模板正文指針來(lái)定位指令)??梢栽谒x擇的組中的每一個(gè)節(jié)點(diǎn)上執(zhí)行指令,結(jié)果可以輸出到輸出生成器46(方框276)。
在一個(gè)實(shí)施例中,轉(zhuǎn)換引擎44可以包括多個(gè)硬件處理器,用于執(zhí)行由樣式表編譯器20生成的指令。即,可以定義處理器的指令集,并且樣式表編譯器20可以生成指令集中的指令。在一些實(shí)施例中,指令集被設(shè)計(jì)為容納對(duì)XSLT語(yǔ)言的擴(kuò)展。轉(zhuǎn)換引擎44可以將在特定節(jié)點(diǎn)上執(zhí)行的指令調(diào)度到某一個(gè)處理器,該處理器可以在該節(jié)點(diǎn)上執(zhí)行指令以生成結(jié)果。
在一個(gè)實(shí)施例中,為對(duì)運(yùn)行時(shí)謂詞進(jìn)行求值而指令執(zhí)行的指令可以這樣排序,以便同時(shí)對(duì)類似的謂詞(例如,具有共同前綴部分的謂詞)進(jìn)行求值,以便獲取節(jié)點(diǎn)以對(duì)謂詞進(jìn)行求值的過(guò)程可以最小化。例如,基于匹配節(jié)點(diǎn)的后面的節(jié)點(diǎn)的謂詞可以分組在一起,并同時(shí)對(duì)它們進(jìn)行求值。
在某些情況下,可以使用表達(dá)式來(lái)聲明樣式表中的變量和/或參數(shù),以后指令可以使用變量/參數(shù)。定義了變量/參數(shù)的表達(dá)式可以包括在分析時(shí)表達(dá)式樹(shù)26中,如此,可以表達(dá)式處理器42對(duì)表達(dá)式進(jìn)行求值(或者,如果表達(dá)式包括運(yùn)行時(shí)謂詞,則部分地求值)。可以以與其他運(yùn)行時(shí)謂詞類似的方式對(duì)運(yùn)行時(shí)謂詞進(jìn)行求值。在一些實(shí)施例中,樣式表編譯器20可以試圖在使用變量/參數(shù)的指令的前面對(duì)用于對(duì)變量/參數(shù)進(jìn)行求值的指令進(jìn)行排序,以降低在對(duì)變量/參數(shù)進(jìn)行求值之前由轉(zhuǎn)換引擎44嘗試執(zhí)行指令的可能性。轉(zhuǎn)換引擎44可以包括一個(gè)等待隊(duì)列,可以向該隊(duì)列中放置使用變量/參數(shù)并且在變量/參數(shù)被求值之前嘗試的指令,可以重新嘗試指令,并將指令重新放置到等待隊(duì)列中,直到變量/參數(shù)被求值。在其他實(shí)施例中,樣式表編譯器20可以明確地標(biāo)識(shí)依賴于各個(gè)變量/參數(shù)的指令,在試圖執(zhí)行每一個(gè)指令之前,轉(zhuǎn)換引擎44可以檢查這樣的依賴關(guān)系。在其他實(shí)施例中,樣式表編譯器20可以重新排列指令,以確保給定指令不在其依賴關(guān)系被滿足之前執(zhí)行。例如,樣式表編譯器20可以構(gòu)建指令的在拓?fù)渖吓判虻臄?shù)據(jù)相關(guān)圖,并可以向給定級(jí)別中的每一個(gè)指令分配組號(hào)。轉(zhuǎn)換引擎44可以不選擇具有給定組號(hào)的給定指令來(lái)執(zhí)行,直到選擇了前面的組中的所有指令來(lái)執(zhí)行。
值得注意的是,上文所描述的指向各個(gè)數(shù)據(jù)結(jié)構(gòu)的指針(以及在各個(gè)數(shù)據(jù)結(jié)構(gòu)內(nèi))可以是全指針(僅指定正在被指向的數(shù)據(jù)的地址)或者可以依照要求,從包含正在被指向的數(shù)據(jù)的結(jié)構(gòu)的基址偏離。
表達(dá)式處理器,其他實(shí)施例下面參考圖17-24B描述表達(dá)式處理器42的另一個(gè)實(shí)施例。此實(shí)施例可以使用有點(diǎn)不同的分析時(shí)表達(dá)式樹(shù)形結(jié)構(gòu),并可以處理其他表達(dá)式。在此示例中使用了XML節(jié)點(diǎn)構(gòu)造,雖然其他實(shí)施例可以使用其他標(biāo)記語(yǔ)言。通過(guò)圖17-24B說(shuō)明的實(shí)施例可以匹配任何節(jié)點(diǎn)(例如,元素、屬性、處理指令、注釋、文本等等),包括可以使用按文檔排序查找到的節(jié)點(diǎn)被求值的謂詞。流程圖可以一般引用匹配文檔節(jié)點(diǎn)和表達(dá)式節(jié)點(diǎn)。如前面所述,這樣的匹配可以包括文檔節(jié)點(diǎn)和表達(dá)式節(jié)點(diǎn)的匹配序列號(hào)。此外,流程圖可以引用將節(jié)點(diǎn)輸出到匹配列表。在一些實(shí)施例中,如前面所述,節(jié)點(diǎn)可以通過(guò)前綴次序編號(hào)在匹配列表中表示。
圖17是說(shuō)明了包括條目300的分析時(shí)表達(dá)式樹(shù)26的另一個(gè)實(shí)施例的方框圖。在圖17中,用于空間原因,條目300被顯示為兩行。條目300可以對(duì)應(yīng)于分析時(shí)表達(dá)式樹(shù)26中的一個(gè)表達(dá)式節(jié)點(diǎn),如此,對(duì)于每一個(gè)表達(dá)式節(jié)點(diǎn),可以有類似于條目300的條目。
類似于圖10所示的條目120,條目300包括頂級(jí)類型(TLT)字段、序列號(hào)(S/N)、葉節(jié)點(diǎn)(LN)字段、級(jí)別結(jié)尾指示(EOL)字段、表達(dá)式列表指針(XLP)字段、模板列表指針(TLP)字段、謂詞類型(PrTP)字段,以及謂詞數(shù)據(jù)(PrDT)字段。此外,條目300可以包括節(jié)點(diǎn)類型(NT)字段、子描述符(CD)字段、Ptr/字段、Ptr//字段、Ptr/Attr字段、Ptr//Attr字段、Ptr/PI字段,以及Ptr//PI字段。值得注意的是,圖17所示的字段的順序可以不對(duì)應(yīng)于存儲(chǔ)器中的字段的順序。相反,顯示的條目300的字段僅說(shuō)明分析時(shí)表達(dá)式樹(shù)條目的一個(gè)實(shí)施例的內(nèi)容。
對(duì)應(yīng)于條目300的表達(dá)式節(jié)點(diǎn)可以具有各種子表達(dá)式節(jié)點(diǎn)。條目300的CD字段可以存儲(chǔ)表達(dá)式節(jié)點(diǎn)具有哪些子表達(dá)式節(jié)點(diǎn)類型的指示。例如,圖18包括說(shuō)明了CD字段的編碼的一個(gè)實(shí)施例的表302。在圖18中所說(shuō)明的實(shí)施例中,CD字段可以包括針對(duì)每一個(gè)子節(jié)點(diǎn)類型和該類型的/或//子的位。例如,在所說(shuō)明的實(shí)施例中有六個(gè)子節(jié)點(diǎn)類型(元素、屬性、文本、注釋、處理指令(PI),以及具有文字的處理指令(PI-literal))。每一種類型可以是表達(dá)式節(jié)點(diǎn)的/子或者//子,如此,在此實(shí)施例中,CD字段包括12個(gè)位。如果設(shè)置了對(duì)應(yīng)的位,那么,表達(dá)式節(jié)點(diǎn)至少具有給定類型的一個(gè)子表達(dá)式節(jié)點(diǎn)(以及/或//)。例如,如果表達(dá)式節(jié)點(diǎn)至少具有一個(gè)/子元素節(jié)點(diǎn),可以設(shè)置CD字段的位11。如果表達(dá)式節(jié)點(diǎn)至少具有一個(gè)//子元素節(jié)點(diǎn),則可以設(shè)置CD字段的位10。其他實(shí)施例可以顛倒設(shè)置以及清除狀態(tài)的含義,也可以使用任何所希望的編碼。CD字段可以用來(lái)判斷給定表達(dá)式節(jié)點(diǎn)是否具有給定類型的任何子,作為表達(dá)式匹配過(guò)程的一部分。
NT字段可以存儲(chǔ)標(biāo)識(shí)了對(duì)應(yīng)于條目300的表達(dá)式節(jié)點(diǎn)的類型的節(jié)點(diǎn)類型。例如,圖18包括了說(shuō)明NT字段的示范性編碼的表304。在示范性實(shí)施例中,NT字段可以包括三個(gè)位編碼,在表304的左列中顯示了其二進(jìn)制值。右列列出了此實(shí)施例的各種節(jié)點(diǎn)類型(例如,元素、屬性、文本、注釋、PI、節(jié)點(diǎn),以及具有目標(biāo)的PI)。其他實(shí)施例可以使用任何其他編碼,并支持所顯示的類型的任何子集或超集。
在所說(shuō)明的實(shí)施例中,條目300可以包括六個(gè)指向分析時(shí)表達(dá)式樹(shù)26中的子節(jié)點(diǎn)條目的指針。Ptr/Attr指針可以指向是表達(dá)式節(jié)點(diǎn)的/子的屬性節(jié)點(diǎn)。/屬性子節(jié)點(diǎn)可以分組在分析時(shí)表達(dá)式樹(shù)26中,從Ptr/Attr指針?biāo)赋龅臈l目開(kāi)始。Ptr//Attr指針可以指向是表達(dá)式節(jié)點(diǎn)的//子的屬性節(jié)點(diǎn)。//屬性子節(jié)點(diǎn)可以分組在分析時(shí)表達(dá)式樹(shù)26中,從Ptr//Attr指針?biāo)赋龅臈l目開(kāi)始。Ptr/PI指針可以指向是表達(dá)式節(jié)點(diǎn)的/子的PI節(jié)點(diǎn)。/PI子節(jié)點(diǎn)可以分組在分析時(shí)表達(dá)式樹(shù)26中,從Ptr/PI指針?biāo)赋龅臈l目開(kāi)始。Ptr//PI指針可以指向是表達(dá)式節(jié)點(diǎn)的//子的屬性節(jié)點(diǎn)。//PI子節(jié)點(diǎn)可以分組在分析時(shí)表達(dá)式樹(shù)26中,從Ptr//PI指針?biāo)赋龅臈l目開(kāi)始。表達(dá)式節(jié)點(diǎn)的其他/子節(jié)點(diǎn)(即,不是屬性或PI節(jié)點(diǎn))被分組在分析時(shí)表達(dá)式樹(shù)26中的Ptr/指針(對(duì)于表達(dá)式節(jié)點(diǎn)的/子)和Ptr//指針(對(duì)于表達(dá)式節(jié)點(diǎn)的//子)。
盡管所說(shuō)明的實(shí)施例提供了單獨(dú)的指針集,來(lái)定位屬性子節(jié)點(diǎn)、處理指令子節(jié)點(diǎn),以及剩余子節(jié)點(diǎn),其他實(shí)施例可以實(shí)現(xiàn)不同的指針集。例如,一個(gè)實(shí)施例可以只包括一個(gè)指針集/指針和//指針來(lái)分別定位所有/子以及所有//子。其他實(shí)施例可以對(duì)于每一種節(jié)點(diǎn)類型實(shí)現(xiàn)/和//指針,或者依照要求以其他方式將節(jié)點(diǎn)分組在指針處。
在此實(shí)施例中,如圖18中的表306所示,PrTP字段可以具有編碼。在此實(shí)施例中,謂詞類型可以包括無(wú)謂詞(具體來(lái)說(shuō),包括無(wú)分析時(shí)的可求值謂詞)、位置謂詞、元素子謂詞、屬性名稱謂詞、具有名稱謂詞的PI節(jié)點(diǎn)測(cè)試、節(jié)點(diǎn)測(cè)試謂詞、注釋節(jié)點(diǎn)測(cè)試謂詞、PI節(jié)點(diǎn)測(cè)試謂詞,以及文本節(jié)點(diǎn)測(cè)試謂詞。節(jié)點(diǎn)測(cè)試謂詞可以簡(jiǎn)單地測(cè)試,有(任何類型)的節(jié)點(diǎn)作為表達(dá)式節(jié)點(diǎn)的子或后代。注釋節(jié)點(diǎn)測(cè)試、PI節(jié)點(diǎn)測(cè)試(沒(méi)有名稱),以及文本節(jié)點(diǎn)測(cè)試謂詞可以測(cè)試是否存在給定類型的節(jié)點(diǎn)。具有名稱的PI節(jié)點(diǎn)測(cè)試可以測(cè)試是否存在具有名稱的具有PI目標(biāo)的PI節(jié)點(diǎn)。其他實(shí)施例可以使用任何其他編碼,并可以支持所顯示的謂詞類型的任何子集或超集。
在一些實(shí)施例中,表達(dá)式列表36和模板列表38可以具有與參考圖9所描述的結(jié)構(gòu)的類似的結(jié)構(gòu)。此外,在一個(gè)實(shí)施例中,每一個(gè)模板列表?xiàng)l目都可以包括節(jié)點(diǎn)ID,該ID標(biāo)識(shí)了,在對(duì)應(yīng)于該模板列表?xiàng)l目的模板匹配表達(dá)式中正在引用哪一個(gè)子節(jié)點(diǎn)(如果適用)。例如,模板列表38可以根據(jù)對(duì)于給定表達(dá)式匹配的最后一個(gè)元素來(lái)進(jìn)行組織(即,表可以包括被元素匹配的表達(dá)式的最后一個(gè)元素的列表,即使表達(dá)式包括元素的非元素子節(jié)點(diǎn))。可以包括在該元素節(jié)點(diǎn)的表達(dá)式列表中的某些表達(dá)式中的屬性、文本、注釋或處理指令子節(jié)點(diǎn)可以由節(jié)點(diǎn)ID來(lái)進(jìn)行標(biāo)識(shí)。節(jié)點(diǎn)ID可以標(biāo)識(shí)子節(jié)點(diǎn)的類型。此外,對(duì)于屬性和處理指令,節(jié)點(diǎn)ID可以分別標(biāo)識(shí)節(jié)點(diǎn)內(nèi)的相對(duì)于其他屬性和處理指令的位置。節(jié)點(diǎn)ID為0可以表示對(duì)于對(duì)應(yīng)的表達(dá)式,沒(méi)有元素節(jié)點(diǎn)的子節(jié)點(diǎn)。
在此實(shí)施例中,分析器電路40可以為表達(dá)式處理器42生成下面的事件頂級(jí)元素開(kāi)始事件、元素開(kāi)始事件、元素結(jié)束事件、屬性名稱事件、文本事件、注釋事件、處理指令事件以及配置事件??梢陨膳渲檬录?,以便為表達(dá)式處理器42建立所希望的樣式表/文檔上下文。
頂級(jí)元素開(kāi)始事件可以標(biāo)識(shí)是根的子的元素的開(kāi)始。是根之外的其他元素的子的元素的開(kāi)始由元素開(kāi)始事件標(biāo)識(shí)。例如,在使用XML的實(shí)施例中,元素開(kāi)始事件可以指出已經(jīng)檢測(cè)到元素開(kāi)始標(biāo)記。每一個(gè)事件都可以包括元素的序列號(hào)。在一些實(shí)施例中,事件還可以包括元素的子位置和/或元素的前綴次序編號(hào)。這些事件可以使表達(dá)式處理器42試圖將元素匹配到分析時(shí)表達(dá)式樹(shù)26中的表達(dá)式。
可以響應(yīng)檢測(cè)到元素的結(jié)尾(例如,在使用XML的實(shí)施例中已經(jīng)檢測(cè)到元素結(jié)束標(biāo)記)而生成元素結(jié)束事件。表達(dá)式處理器42可以響應(yīng)其元素結(jié)束事件清空被元素匹配的任何表達(dá)式分支。
可以響應(yīng)檢測(cè)到屬性名稱的情況而生成屬性名稱事件。屬性名稱事件可以包括屬性名稱的序列號(hào),在一些實(shí)施例中,可以包括元素所對(duì)應(yīng)的屬性的前綴次序編號(hào)。表達(dá)式處理器42可以試圖響應(yīng)屬性名稱事件將屬性名稱匹配到表達(dá)式樹(shù)中的表達(dá)式。
可以響應(yīng)檢測(cè)文檔中的文本而生成文本事件。文本事件可以包括對(duì)應(yīng)元素的前綴次序編號(hào),并可以使表達(dá)式處理器42檢查表達(dá)式樹(shù)中的表達(dá)式,以查找文本節(jié)點(diǎn)測(cè)試或文本表達(dá)式節(jié)點(diǎn)的匹配。類似地,可以響應(yīng)檢測(cè)文檔中的注釋節(jié)點(diǎn)而生成注釋事件。注釋事件可以包括對(duì)應(yīng)元素的前綴次序編號(hào),并可以使表達(dá)式處理器42檢查表達(dá)式樹(shù)中的表達(dá)式,以查找注釋節(jié)點(diǎn)測(cè)試或注釋表達(dá)式節(jié)點(diǎn)的匹配。
可以響應(yīng)檢測(cè)到處理指令而生成處理指令事件。處理指令事件可以包括處理指令的序列號(hào),在一些實(shí)施例中,還可以包括對(duì)應(yīng)元素的前綴次序編號(hào)。表達(dá)式處理器42可以試圖將處理指令匹配到處理指令節(jié)點(diǎn)測(cè)試,有或者沒(méi)有文字,或匹配到處理指令表達(dá)式節(jié)點(diǎn)。
下面請(qǐng)參考圖19A-19B,顯示了一個(gè)流程圖,該流程圖說(shuō)明了響應(yīng)元素開(kāi)始事件(包括元素開(kāi)始和頂級(jí)元素開(kāi)始事件),使用圖17中所示的分析時(shí)表達(dá)式樹(shù)26,表達(dá)式處理器42的一個(gè)實(shí)施例的操作。一般而言,處理可以包括檢查相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn)(如果事件是頂級(jí)元素開(kāi)始事件,還包括非相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn)),以查看是否有元素的匹配,以及檢查元素是否滿足/和//堆棧39C和39D上表達(dá)式節(jié)點(diǎn)的謂詞或者是這樣的表達(dá)式節(jié)點(diǎn)的元素子節(jié)點(diǎn)。
表達(dá)式處理器42可以將/和//堆棧指針推到指針堆棧39E中(方框310)。具體來(lái)說(shuō),在所說(shuō)明的實(shí)施例中,指針堆棧39E可以分別包括/堆棧指針的/Ptr堆棧和//堆棧指針的//Ptr堆棧?;蛘撸渌麑?shí)施例可以將兩種指針推到同一個(gè)堆棧中。當(dāng)對(duì)應(yīng)元素結(jié)束事件發(fā)生時(shí),可以隨后彈出指針,以將/堆棧39C和//堆棧39D的狀態(tài)恢復(fù)到檢測(cè)到元素之前的狀態(tài)(允許另一個(gè)元素匹配到在正在結(jié)束該元素之前匹配的表達(dá)式)。由元素開(kāi)始事件標(biāo)識(shí)的元素在圖19A-19B的描述中被簡(jiǎn)稱為“元素”。取決于是否已經(jīng)接收到頂級(jí)元素開(kāi)始事件(判斷方框312),表達(dá)式處理器42可以檢查分析時(shí)表達(dá)式樹(shù)中的每一個(gè)頂級(jí)表達(dá)式節(jié)點(diǎn)(例如,包括絕對(duì)和祖先頂級(jí)表達(dá)式節(jié)點(diǎn))(方框316)或每一個(gè)相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn)(方框314),以查找匹配。即,如果事件是頂級(jí)元素開(kāi)始事件(判斷方框312,“是”支線),則表達(dá)式處理器42可以檢查分析時(shí)表達(dá)式樹(shù)26中的每一個(gè)頂級(jí)表達(dá)式節(jié)點(diǎn),因?yàn)榧词箤?duì)照根節(jié)點(diǎn)的子節(jié)點(diǎn)的絕對(duì)頂級(jí)節(jié)點(diǎn),也可以檢測(cè)到匹配(方框316)。另一方面,如果事件不是頂級(jí)元素開(kāi)始事件(判斷方框312,“否”支線),則表達(dá)式處理器42可以檢查分析時(shí)表達(dá)式樹(shù)26中的每一個(gè)相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn),因?yàn)閷?duì)照絕對(duì)頂級(jí)節(jié)點(diǎn),可能檢測(cè)不到匹配(方框314)。
如果對(duì)照任何頂級(jí)節(jié)點(diǎn)沒(méi)有檢測(cè)到匹配(判斷方框318,“否”支線),則流程圖在圖19B中的參考點(diǎn)D處繼續(xù)。如果檢測(cè)到匹配(判斷方框318,“是”支線),并且表達(dá)式節(jié)點(diǎn)是葉節(jié)點(diǎn)(判斷方框320,“是”支線),則元素節(jié)點(diǎn)被輸出到對(duì)應(yīng)于由分析時(shí)表達(dá)式樹(shù)26的表達(dá)式節(jié)點(diǎn)的條目中的XLP和TLP指針?biāo)赶虻谋磉_(dá)式和/或模板的匹配列表(方框322)。表達(dá)式處理器42判斷匹配的表達(dá)式節(jié)點(diǎn)是否具有任何/或//子(分別為判斷方框324和326),如果匹配的表達(dá)式節(jié)點(diǎn)具有任何/或//子(分別為方框328和330),則將匹配的表達(dá)式節(jié)點(diǎn)分別推到/堆棧39C和/或//堆棧39D上。表達(dá)式處理器42可以使用分析時(shí)表達(dá)式樹(shù)26中的表達(dá)式節(jié)點(diǎn)的條目的CD字段來(lái)檢測(cè)是否有/或//子。此外,/堆棧39C和//堆棧39D可以包括用于管理分析時(shí)謂詞的匹配的eval字段(通過(guò)分析時(shí)表達(dá)式樹(shù)條目300中的PrTP和PrDT字段指出)。如果有分析時(shí)謂詞(通過(guò)PrTP字段不等于0來(lái)表示),eval字段可以被設(shè)置為0。否則,eval字段可以被設(shè)置為1。流程圖在圖19B中的參考點(diǎn)D處繼續(xù)。
在圖19B中的參考點(diǎn)D處繼續(xù),搜索/和//堆棧以查看元素是否匹配以前匹配的表達(dá)式節(jié)點(diǎn)的子或謂詞(存儲(chǔ)在/或//堆棧的其中一個(gè)條目中)。如果/和//堆棧是空的(判斷方框332,“是”支線),則對(duì)于此元素,匹配結(jié)束。否則(判斷方框332,“否”支線),選擇一個(gè)堆棧條目。如果該條目中的eval字段被設(shè)置為1,則所選擇的堆棧條目中的對(duì)應(yīng)的表達(dá)式節(jié)點(diǎn)要么沒(méi)有謂詞,要么謂詞已經(jīng)被以前分析的文檔節(jié)點(diǎn)滿足。相應(yīng)地(判斷方框334,“eval=1”支線),表達(dá)式處理器42可以檢查所選擇的堆棧條目中的表達(dá)式節(jié)點(diǎn)的任何元素子節(jié)點(diǎn),以判斷元素是否匹配任何元素子節(jié)點(diǎn)??梢钥紤]/元素子節(jié)點(diǎn)和//元素子節(jié)點(diǎn)。具體來(lái)說(shuō),如果表達(dá)式節(jié)點(diǎn)沒(méi)有元素子節(jié)點(diǎn)(如分析時(shí)表達(dá)式樹(shù)條目300的CD字段中所指出的)(判斷方框336,“否”支線),對(duì)于該元素,匹配過(guò)程結(jié)束?;蛘撸磉_(dá)式處理器42可以轉(zhuǎn)到下一個(gè)堆棧條目(方框362)以便進(jìn)行處理。如果表達(dá)式節(jié)點(diǎn)具有元素子節(jié)點(diǎn)(判斷方框336,“是”支線),則表達(dá)式處理器42獲取表達(dá)式節(jié)點(diǎn)的第一元素子節(jié)點(diǎn)(方框338)。例如,該條目的Ptr/或Ptr//指針可以用來(lái)定位元素子節(jié)點(diǎn)(以及子表達(dá)式樹(shù)條目中的NT類型字段)。如果子元素節(jié)點(diǎn)匹配元素(方框340,“是”支線),并且子元素節(jié)點(diǎn)是葉節(jié)點(diǎn)(判斷方框342,“是”支線),則節(jié)點(diǎn)被輸出到匹配列表(方框344)。此外,如果匹配的子元素節(jié)點(diǎn)分別具有/或//(判斷方框346和348),則匹配的子元素節(jié)點(diǎn)分別被推到/堆棧39C或//堆棧39D(方框350和352),如上參考方框324-330所描述的,eval字段被初始化。不管子元素節(jié)點(diǎn)是否匹配元素,表達(dá)式處理器42都判斷是否已經(jīng)處理了最后一個(gè)元素子節(jié)點(diǎn)(判斷方框354)。如果沒(méi)有,則獲取下一個(gè)子元素節(jié)點(diǎn)(方框338),并以類似的方式對(duì)其進(jìn)行處理。如果子元素節(jié)點(diǎn)是當(dāng)前堆棧條目的最后一個(gè)元素子節(jié)點(diǎn)(判斷方框354,“是”支線),則表達(dá)式處理器42可以轉(zhuǎn)到下一個(gè)堆棧條目(方框362)并處理元素子節(jié)點(diǎn)和謂詞。
如果所選擇的堆棧條目的PrTP字段等于4,或者元素子節(jié)點(diǎn),那么,元素可以滿足所選擇的堆棧條目中的表達(dá)式節(jié)點(diǎn)的謂詞是可能的。如此(判斷方框334,“PrTP=4”支線),表達(dá)式處理器42可以將元素序列號(hào)與所選擇的堆棧條目的PrDT字段進(jìn)行比較(方框356)。如果元素匹配PrDT字段(判斷方框358,“是”支線),則元素滿足謂詞,并且表達(dá)式處理器42將所選擇的堆棧條目的eval字段設(shè)置為1(方框360)。不論是哪一種情況,表達(dá)式處理器42都可以轉(zhuǎn)到下一個(gè)堆棧條目(方框362)。
值得注意的是,給定堆棧條目可以讓eval字段等于0,PrTP字段不等于4。在這樣的情況下,表達(dá)式處理器42可以轉(zhuǎn)到下一個(gè)堆棧條目(方框362)。
現(xiàn)在請(qǐng)參看圖20,顯示了一個(gè)流程圖,該流程圖說(shuō)明了響應(yīng)元素結(jié)束事件,使用圖17所示的分析時(shí)表達(dá)式樹(shù)26,表達(dá)式處理器42的一個(gè)實(shí)施例的操作。
如果元素結(jié)束事件是針對(duì)文檔的根節(jié)點(diǎn)的(判斷方框370,“是”支線),則文檔是完整的(方框372)。表達(dá)式處理器42可以清除堆棧39C-39F。如果元素結(jié)束事件不是針對(duì)文檔的根節(jié)點(diǎn)的(判斷方框370,“否”支線),則表達(dá)式處理器42可以從Ptr堆棧39E彈出/和//堆棧指針(方框374)。由于元素正在結(jié)束,元素的所有子元素以前都已經(jīng)被分析。相應(yīng)地,/和堆棧中的對(duì)應(yīng)于元素的任何條目(即,具有元素的序列號(hào)的條目)不能被隨后檢測(cè)到的節(jié)點(diǎn)匹配。事實(shí)上,恢復(fù)當(dāng)檢測(cè)到元素的元素開(kāi)始事件時(shí)推入的/和//堆棧指針會(huì)彈出/和//堆棧39C-39D上的對(duì)應(yīng)于結(jié)束元素的條目,并將它們的狀態(tài)恢復(fù)到對(duì)該元素進(jìn)行處理之前的狀態(tài)(可以是用于處理下一個(gè)檢測(cè)到的元素的正確狀態(tài))。
現(xiàn)在請(qǐng)參看圖21A-21B,顯示了一個(gè)流程圖,該流程圖說(shuō)明了響應(yīng)屬性名稱事件,使用圖17所示的分析時(shí)表達(dá)式樹(shù)26,表達(dá)式處理器42的一個(gè)實(shí)施例的操作。由屬性名稱事件標(biāo)識(shí)的屬性在圖21A-21B中的描述中被稱為“屬性”。一般而言,處理可以包括檢查相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn),以查看是否有屬性的匹配,以及檢查屬性是否滿足/和//堆棧39C和39D上的表達(dá)式節(jié)點(diǎn)的謂詞,或者是這樣的表達(dá)式節(jié)點(diǎn)的屬性子節(jié)點(diǎn)。
如果屬性的父節(jié)點(diǎn)是根節(jié)點(diǎn)(判斷方框202,“是”支線),那么,不需要執(zhí)行其他處理(因?yàn)楦?jié)點(diǎn)沒(méi)有屬性)。另一方面,如果屬性的父節(jié)點(diǎn)不是根節(jié)點(diǎn)(判斷方框382,“否”支線),則表達(dá)式處理器42繼續(xù)。
表達(dá)式處理器42可以檢查每一個(gè)相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn),以查找與屬性的匹配(方框384)。如果存在與給定相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn)的匹配(判斷方框386,“是”支線),并且節(jié)點(diǎn)是葉節(jié)點(diǎn)(判斷方框388,“是”支線),則將屬性節(jié)點(diǎn)輸出到匹配列表39G(方框390)。不管是否存在匹配,都可以對(duì)下一相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn)繼續(xù)處理,直到頂級(jí)表達(dá)式節(jié)點(diǎn)耗盡(判斷方框392,“否”支線)。一旦耗盡了頂級(jí)表達(dá)式節(jié)點(diǎn)(判斷方框392,“是”支線),處理在圖23B中的參考點(diǎn)E處繼續(xù)。
在圖21B中的參考點(diǎn)E處繼續(xù),搜索/和//堆棧以查看屬性是否匹配以前匹配的表達(dá)式節(jié)點(diǎn)的子或謂詞(存儲(chǔ)在/或//堆棧的其中一個(gè)條目中)。如果/和//堆棧是空的(判斷方框394,“是”支線),則對(duì)于此屬性,匹配結(jié)束。否則(判斷方框394,“否”支線),選擇一個(gè)堆棧條目。如果該條目中的eval字段被設(shè)置為1,則所選擇的堆棧條目中的對(duì)應(yīng)的表達(dá)式節(jié)點(diǎn)要么沒(méi)有謂詞,要么謂詞已經(jīng)被以前分析的文檔節(jié)點(diǎn)滿足。相應(yīng)地(判斷方框334,“eval=1”支線),表達(dá)式處理器42可以檢查所選擇的堆棧條目中的表達(dá)式節(jié)點(diǎn)的任何屬性子節(jié)點(diǎn),以判斷屬性是否匹配任何屬性子節(jié)點(diǎn)??梢钥紤]/和//屬性子節(jié)點(diǎn)。具體來(lái)說(shuō),如果所選擇的條目中的表達(dá)式節(jié)點(diǎn)沒(méi)有屬性子節(jié)點(diǎn)(如所指出的,例如,在分析時(shí)表達(dá)式樹(shù)條目300的CD字段中)(判斷方框398,“否”支線),則表達(dá)式處理器42可以判斷是否已經(jīng)處理了堆棧中的最后一個(gè)表達(dá)式節(jié)點(diǎn)(判斷方框400)。如果是(判斷方框400,“是”支線),則對(duì)于該屬性,處理結(jié)束。否則(判斷方框400,“否”支線),表達(dá)式處理器42可以轉(zhuǎn)到下一個(gè)堆棧條目(方框410)以便進(jìn)行處理。如果所選擇的條目中的表達(dá)式節(jié)點(diǎn)具有屬性子節(jié)點(diǎn)(判斷方框398,“是”支線),則表達(dá)式處理器42獲取該條目的第一屬性子節(jié)點(diǎn)(方框402)。例如,條目的Ptr/Attr或Ptr//Attr指針可以用來(lái)定位屬性子節(jié)點(diǎn)。如果子屬性節(jié)點(diǎn)匹配屬性(方框404,“是”支線),則該節(jié)點(diǎn)被輸出到匹配列表(方框406)。不管子屬性節(jié)點(diǎn)是否匹配屬性,表達(dá)式處理器42都判斷是否已經(jīng)處理了最后一個(gè)屬性子節(jié)點(diǎn)(判斷方框408)。如果沒(méi)有,則獲取下一個(gè)屬性子節(jié)點(diǎn)(方框402),并以類似的方式對(duì)其進(jìn)行處理。如果子屬性節(jié)點(diǎn)是所選擇的堆棧條目中的表達(dá)式節(jié)點(diǎn)的最后一個(gè)屬性子節(jié)點(diǎn)(判斷方框408,“是”支線),則表達(dá)式處理器42可以判斷是否已經(jīng)處理了最后一個(gè)表達(dá)式節(jié)點(diǎn)(判斷方框400),并可以轉(zhuǎn)到下一個(gè)堆棧條目(方框410)或相應(yīng)地終止處理。
如果所選擇的堆棧條目的PrTP字段等于5,或者屬性名稱,那么,屬性可以滿足所選擇的堆棧條目中的表達(dá)式節(jié)點(diǎn)的謂詞是可能的。如此(判斷方框396,“PrTP=5”支線),表達(dá)式處理器42可以將屬性序列號(hào)與所選擇的堆棧條目的PrDT字段進(jìn)行比較(方框412)。如果屬性匹配PrDT字段(判斷方框414,“是”支線),則屬性滿足謂詞,并且表達(dá)式處理器42將所選擇的堆棧條目的eval字段設(shè)置為1(方框416)。不論是哪一種情況,表達(dá)式處理器42都可以轉(zhuǎn)到下一個(gè)堆棧條目(方框410)。如果希望,表達(dá)式處理器42可以在前進(jìn)之前判斷是否有任何剩余表達(dá)式節(jié)點(diǎn)(判斷方框400)。
值得注意的是,給定堆棧條目可以讓eval字段等于0,讓PrTP字段不等于5。在這樣的情況下,表達(dá)式處理器42可以轉(zhuǎn)到下一個(gè)堆棧條目(方框410)。
現(xiàn)在請(qǐng)參看圖22A-22B,顯示了一個(gè)流程圖,該流程圖說(shuō)明了響應(yīng)文本事件,使用圖17所示的分析時(shí)表達(dá)式樹(shù)26,表達(dá)式處理器42的一個(gè)實(shí)施例的操作。由文本事件標(biāo)識(shí)的文本節(jié)點(diǎn)在圖22A-22B的描述中被稱為“文本節(jié)點(diǎn)”。一般而言,處理可以包括檢查相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn),以查看是否有文本節(jié)點(diǎn)的匹配,以及檢查文本節(jié)點(diǎn)是否滿足/和//堆棧39C和39D上的表達(dá)式節(jié)點(diǎn)的謂詞,或者是這樣的表達(dá)式節(jié)點(diǎn)的文本子節(jié)點(diǎn)。
如果文本節(jié)點(diǎn)的父節(jié)點(diǎn)是根節(jié)點(diǎn)(判斷方框420,“是”支線),那么,不需要執(zhí)行其他處理。另一方面,如果文本節(jié)點(diǎn)的父節(jié)點(diǎn)不是根節(jié)點(diǎn)(判斷方框420,“否”支線),則表達(dá)式處理器42繼續(xù)。
表達(dá)式處理器42可以檢查每一個(gè)相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn),以查找與文本節(jié)點(diǎn)的匹配(方框422)。如果存在與給定相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn)的匹配(判斷方框424,“是”支線),則將文本節(jié)點(diǎn)輸出到匹配列表39G(方框426)。不管是否存在匹配,都可以對(duì)下一相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn)繼續(xù)處理,直到頂級(jí)表達(dá)式節(jié)點(diǎn)耗盡(判斷方框428,“否”支線)。一旦耗盡了頂級(jí)表達(dá)式節(jié)點(diǎn)(判斷方框428,“是”支線),處理在圖24B中的參考點(diǎn)F處繼續(xù)。
在圖22B中的參考點(diǎn)F處繼續(xù),搜索/和//堆棧以查看文本節(jié)點(diǎn)是否匹配以前匹配的表達(dá)式節(jié)點(diǎn)的子或謂詞(存儲(chǔ)在/或//堆棧的其中一個(gè)條目中)。如果/和//堆棧是空的(判斷方框430,“是”支線),則對(duì)于此文本節(jié)點(diǎn),匹配結(jié)束。否則(判斷方框430,“否”支線),選擇一個(gè)堆棧條目。如果該條目中的eval字段被設(shè)置為1,則所選擇的堆棧條目中的對(duì)應(yīng)的表達(dá)式節(jié)點(diǎn)要么沒(méi)有謂詞,要么謂詞已經(jīng)被以前分析的文檔節(jié)點(diǎn)滿足。相應(yīng)地(判斷方框432,“eval=1”支線),表達(dá)式處理器42可以檢查所選擇的堆棧條目中的表達(dá)式節(jié)點(diǎn)的任何文本子節(jié)點(diǎn),以判斷文本節(jié)點(diǎn)是否匹配任何文本子節(jié)點(diǎn)。具體來(lái)說(shuō),如果表達(dá)式節(jié)點(diǎn)沒(méi)有文本子節(jié)點(diǎn)(如所指出的,例如,在分析時(shí)表達(dá)式樹(shù)條目300的CD字段中)(判斷方框434,“否”支線),則表達(dá)式處理器42可以判斷是否已經(jīng)處理了堆棧中的最后一個(gè)表達(dá)式節(jié)點(diǎn)(判斷方框446)。如果是(判斷方框446,“是”支線),則對(duì)于文本節(jié)點(diǎn),處理結(jié)束。否則(判斷方框446,“否”支線),表達(dá)式處理器42可以轉(zhuǎn)到下一個(gè)堆棧條目(方框448)以便進(jìn)行處理。如果表達(dá)式節(jié)點(diǎn)具有文本子節(jié)點(diǎn)(判斷方框434,“是”支線),則表達(dá)式處理器42獲取表達(dá)式節(jié)點(diǎn)的第一文本子節(jié)點(diǎn)(方框436)。例如,該條目的Ptr/或Ptr//指針可以用來(lái)定位文本子節(jié)點(diǎn)(以及每一個(gè)子節(jié)點(diǎn)中的NT字段)。如果子文本節(jié)點(diǎn)匹配文本節(jié)點(diǎn)(方框438,“是”支線),則該節(jié)點(diǎn)被輸出到匹配列表(方框440)。不管子文本節(jié)點(diǎn)是否匹配文本節(jié)點(diǎn),表達(dá)式處理器42都判斷是否已經(jīng)處理了最后一個(gè)文本子節(jié)點(diǎn)(判斷方框442)。如果沒(méi)有,則獲取下一個(gè)文本子節(jié)點(diǎn)(方框436),并以類似的方式對(duì)其進(jìn)行處理。如果子文本節(jié)點(diǎn)是所選擇的堆棧條目中的表達(dá)式節(jié)點(diǎn)的最后一個(gè)文本子節(jié)點(diǎn)(判斷方框442,“是”支線),則表達(dá)式處理器42可以判斷是否已經(jīng)處理了最后一個(gè)表達(dá)式節(jié)點(diǎn)(判斷方框446),并可以轉(zhuǎn)到下一個(gè)堆棧條目(方框448)或相應(yīng)地終止處理。
如果所選擇的堆棧條目的PrTP字段等于8(節(jié)點(diǎn)測(cè)試)或者B(文本節(jié)點(diǎn)測(cè)試),那么,文本節(jié)點(diǎn)滿足所選擇的堆棧條目中的表達(dá)式節(jié)點(diǎn)的謂詞(判斷方框432,“PrTP=8或者B”支線)。如此,表達(dá)式處理器42將所選擇的堆棧條目的eval字段設(shè)置為1(方框444)。表達(dá)式處理器42可以轉(zhuǎn)到下一個(gè)堆棧條目(方框448)。如果希望,表達(dá)式處理器42可以在前進(jìn)之前判斷是否有任何剩余表達(dá)式節(jié)點(diǎn)(判斷方框446)。
值得注意的是,給定堆棧條目可以讓eval字段等于0,讓PrTP字段不等于8或B。在這樣的情況下,表達(dá)式處理器42可以轉(zhuǎn)到下一個(gè)堆棧條目(方框448)。
現(xiàn)在請(qǐng)參看圖23A-23B,顯示了一個(gè)流程圖,該流程圖說(shuō)明了響應(yīng)注釋事件,使用圖17所示的分析時(shí)表達(dá)式樹(shù)26,表達(dá)式處理器42的一個(gè)實(shí)施例的操作。由注釋事件標(biāo)識(shí)的注釋節(jié)點(diǎn)在圖23A-23B的描述中被簡(jiǎn)稱為“注釋節(jié)點(diǎn)”。一般而言,處理可以包括檢查相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn),以查看是否有注釋節(jié)點(diǎn)的匹配,以及檢查注釋節(jié)點(diǎn)是否滿足/和//堆棧39C和39D上的表達(dá)式節(jié)點(diǎn)的謂詞,或者是這樣的表達(dá)式節(jié)點(diǎn)的注釋子節(jié)點(diǎn)。
如果注釋節(jié)點(diǎn)的父節(jié)點(diǎn)是根節(jié)點(diǎn)(判斷方框450,“是”支線),那么,不需要執(zhí)行其他處理。另一方面,如果注釋節(jié)點(diǎn)的父節(jié)點(diǎn)不是根節(jié)點(diǎn)(判斷方框450,“否”支線),則表達(dá)式處理器42繼續(xù)。
表達(dá)式處理器42可以檢查每一個(gè)相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn),以查找與注釋節(jié)點(diǎn)的匹配(方框452)。如果存在與給定相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn)的匹配(判斷方框454,“是”支線),則將注釋節(jié)點(diǎn)輸出到匹配列表39G(方框456)。不管是否存在匹配,都可以對(duì)下一相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn)繼續(xù)處理,直到頂級(jí)表達(dá)式節(jié)點(diǎn)耗盡(判斷方框458,“否”支線)。一旦耗盡了頂級(jí)表達(dá)式節(jié)點(diǎn)(判斷方框458,“是”支線),處理在圖23B中的參考點(diǎn)G處繼續(xù)。
在圖23B中的參考點(diǎn)G處繼續(xù),搜索/和//堆棧以查看注釋節(jié)點(diǎn)是否匹配以前匹配的表達(dá)式節(jié)點(diǎn)的子或謂詞(存儲(chǔ)在/或//堆棧的其中一個(gè)條目中)。如果/和//堆棧是空的(判斷方框460,“是”支線),則對(duì)于此注釋節(jié)點(diǎn),匹配結(jié)束。否則(判斷方框460,“否”支線),選擇一個(gè)堆棧條目。如果該條目中的eval字段被設(shè)置為1,則所選擇的堆棧條目中的對(duì)應(yīng)的表達(dá)式節(jié)點(diǎn)要么沒(méi)有謂詞,要么謂詞已經(jīng)被以前分析的文檔節(jié)點(diǎn)滿足。相應(yīng)地(判斷方框462,“eval=1”支線),表達(dá)式處理器42可以檢查所選擇的堆棧條目中的表達(dá)式節(jié)點(diǎn)的任何注釋子節(jié)點(diǎn),以判斷注釋節(jié)點(diǎn)是否匹配任何注釋子節(jié)點(diǎn)。具體來(lái)說(shuō),如果所選擇的條目中的表達(dá)式節(jié)點(diǎn)沒(méi)有注釋子節(jié)點(diǎn)(如所指出的,例如,在分析時(shí)表達(dá)式樹(shù)條目300的CD字段中)(判斷方框464,“否”支線),則表達(dá)式處理器42可以判斷是否已經(jīng)處理了堆棧中的最后一個(gè)表達(dá)式節(jié)點(diǎn)(判斷方框476)。如果是(判斷方框476,“是”支線),則對(duì)于注釋節(jié)點(diǎn),處理結(jié)束。否則(判斷方框476,“否”支線),表達(dá)式處理器42可以轉(zhuǎn)到下一個(gè)堆棧條目(方框478)以便進(jìn)行處理。如果表達(dá)式節(jié)點(diǎn)具有注釋子節(jié)點(diǎn)(判斷方框464,“是”支線),則表達(dá)式處理器42獲取表達(dá)式節(jié)點(diǎn)的第一注釋子節(jié)點(diǎn)(方框456)。例如,該條目的Ptr/或Ptr//指針可以用來(lái)定位注釋子節(jié)點(diǎn)(以及每一個(gè)子節(jié)點(diǎn)中的NT字段)。如果子注釋節(jié)點(diǎn)匹配注釋節(jié)點(diǎn)(方框468,“是”支線),則該節(jié)點(diǎn)被輸出到匹配列表(方框470)。不管子注釋節(jié)點(diǎn)是否匹配注釋節(jié)點(diǎn),表達(dá)式處理器42都判斷是否已經(jīng)處理了最后一個(gè)注釋子節(jié)點(diǎn)(判斷方框472)。如果沒(méi)有,則獲取下一個(gè)注釋子節(jié)點(diǎn)(方框466),并以類似的方式對(duì)其進(jìn)行處理。如果子注釋節(jié)點(diǎn)是所選擇的堆棧條目中的表達(dá)式節(jié)點(diǎn)的最后一個(gè)子注釋(判斷方框472,“是”支線),則表達(dá)式處理器42可以判斷是否已經(jīng)處理了最后一個(gè)表達(dá)式節(jié)點(diǎn)(判斷方框476),并可以轉(zhuǎn)到下一個(gè)堆棧條目(方框478)或相應(yīng)地終止處理。
如果所選擇的堆棧條目的PrTP字段等于8(節(jié)點(diǎn)測(cè)試)或者9(注釋節(jié)點(diǎn)測(cè)試),那么,注釋節(jié)點(diǎn)滿足所選擇的堆棧條目中的表達(dá)式節(jié)點(diǎn)的謂詞(判斷方框462,“PrTP=8或者9”支線)。如此,表達(dá)式處理器42將所選擇的堆棧條目的eval字段設(shè)置為1(方框474)。表達(dá)式處理器42可以轉(zhuǎn)到下一個(gè)堆棧條目(方框478)。如果希望,表達(dá)式處理器42可以在前進(jìn)之前判斷是否有任何剩余表達(dá)式節(jié)點(diǎn)(判斷方框476)。
值得注意的是,給定堆棧條目可以讓eval字段等于0,讓PrTP字段不等于8或9。在這樣的情況下,表達(dá)式處理器42可以轉(zhuǎn)到下一個(gè)堆棧條目(方框478)。
現(xiàn)在請(qǐng)參看圖24A-24B,顯示了一個(gè)流程圖,該流程圖說(shuō)明了響應(yīng)處理指令事件,使用圖17所示的分析時(shí)表達(dá)式樹(shù)26,表達(dá)式處理器42的一個(gè)實(shí)施例的操作。在處理指令事件中標(biāo)識(shí)的處理指令節(jié)點(diǎn)可以在圖24A-24B的描述中被稱為“處理指令節(jié)點(diǎn)”或“PI節(jié)點(diǎn)”。一般而言,處理可以包括檢查相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn),以查看是否有PI節(jié)點(diǎn)的匹配,以及檢查PI節(jié)點(diǎn)是否滿足/和//堆棧39C和39D上的表達(dá)式節(jié)點(diǎn)的謂詞,或者是這樣的表達(dá)式節(jié)點(diǎn)的PI子節(jié)點(diǎn)。
如果PI節(jié)點(diǎn)的父節(jié)點(diǎn)是根節(jié)點(diǎn)(判斷方框480,“是”支線),那么,不需要執(zhí)行其他處理。另一方面,如果PI節(jié)點(diǎn)的父節(jié)點(diǎn)不是根節(jié)點(diǎn)(判斷方框480,“否”支線),則表達(dá)式處理器42繼續(xù)。
表達(dá)式處理器42可以檢查每一個(gè)相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn),以查找與PI節(jié)點(diǎn)的匹配(方框482)。如果存在與給定相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn)的匹配(判斷方框484,“是”支線),則將PI節(jié)點(diǎn)輸出到匹配列表39G(方框486)。不管是否存在匹配,都可以對(duì)下一相對(duì)頂級(jí)表達(dá)式節(jié)點(diǎn)繼續(xù)處理,直到頂級(jí)表達(dá)式節(jié)點(diǎn)耗盡(判斷方框488,“否”支線)。一旦耗盡了頂級(jí)表達(dá)式節(jié)點(diǎn)(判斷方框488,“是”支線),處理在圖24B中的參考點(diǎn)H處繼續(xù)。
在圖24B中的參考點(diǎn)H處繼續(xù),搜索/和//堆棧以查看PI節(jié)點(diǎn)是否匹配以前匹配的表達(dá)式節(jié)點(diǎn)的子或謂詞(存儲(chǔ)在/或//堆棧的其中一個(gè)條目中)。如果/和//堆棧是空的(判斷方框490,“是”支線),則對(duì)于此PI節(jié)點(diǎn),匹配結(jié)束。否則(判斷方框490,“否”支線),選擇一個(gè)堆棧條目。如果該條目中的eval字段被設(shè)置為1,則所選擇的堆棧條目中的對(duì)應(yīng)的表達(dá)式節(jié)點(diǎn)要么沒(méi)有謂詞,要么謂詞已經(jīng)被以前分析的文檔節(jié)點(diǎn)滿足。相應(yīng)地(判斷方框492,“eval=1”支線),表達(dá)式處理器42可以檢查所選擇的堆棧條目中的表達(dá)式節(jié)點(diǎn)的任何PI子節(jié)點(diǎn),以判斷PI節(jié)點(diǎn)是否匹配任何PI子節(jié)點(diǎn)。具體來(lái)說(shuō),如果所選擇的條目中的表達(dá)式節(jié)點(diǎn)沒(méi)有子PI(如所指出的,例如,在分析時(shí)表達(dá)式樹(shù)條目300的CD字段中)(判斷方框494,“否”支線),則表達(dá)式處理器42可以判斷是否已經(jīng)處理了堆棧中的最后一個(gè)表達(dá)式節(jié)點(diǎn)(判斷方框512)。如果是(判斷方框512,“是”支線),則對(duì)于PI節(jié)點(diǎn),處理結(jié)束。否則(判斷方框512,“否”支線),表達(dá)式處理器42可以轉(zhuǎn)到下一個(gè)堆棧條目(方框514)以便進(jìn)行處理。如果所選擇的條目中的表達(dá)式節(jié)點(diǎn)具有子PI(判斷方框494,“是”支線),則表達(dá)式處理器42獲取所選擇的條目中的表達(dá)式節(jié)點(diǎn)的第一子PI(方框496)。例如,條目的Ptr/PI或Ptr//PI指針可以用來(lái)定位子PI。如果子PI節(jié)點(diǎn)匹配PI節(jié)點(diǎn)(方框498,“是”支線),則該節(jié)點(diǎn)被輸出到匹配列表(方框500)。不管子PI節(jié)點(diǎn)是否匹配PI節(jié)點(diǎn),表達(dá)式處理器42都判斷是否已經(jīng)處理了最后一個(gè)PI子節(jié)點(diǎn)(判斷方框502)。如果沒(méi)有,則獲取下一個(gè)PI子節(jié)點(diǎn)(方框496),并以類似的方式對(duì)其進(jìn)行處理。如果子PI節(jié)點(diǎn)是所選擇的堆棧條目中的表達(dá)式節(jié)點(diǎn)的最后一個(gè)PI子節(jié)點(diǎn)(判斷方框502,“是”支線),則表達(dá)式處理器42可以判斷是否已經(jīng)處理了最后一個(gè)表達(dá)式節(jié)點(diǎn)(判斷方框512),并可以轉(zhuǎn)到下一個(gè)堆棧條目(方框514)或相應(yīng)地終止處理。
如果所選擇的堆棧條目的PrTP字段等于8(節(jié)點(diǎn)測(cè)試)或者A(PI節(jié)點(diǎn)測(cè)試),那么,PI節(jié)點(diǎn)滿足所選擇的堆棧條目中的表達(dá)式節(jié)點(diǎn)的謂詞。如此,表達(dá)式處理器42將所選擇的堆棧條目的eval字段設(shè)置為1(方框510)。表達(dá)式處理器42可以轉(zhuǎn)到下一個(gè)堆棧條目(方框514)。如果希望,表達(dá)式處理器42可以在前進(jìn)之前判斷是否有任何剩余表達(dá)式節(jié)點(diǎn)(判斷方框512)。
如果所選擇的堆棧條目的PrTP字段等于6(具有名稱的PI節(jié)點(diǎn)測(cè)試),那么,如果PI節(jié)點(diǎn)的PITarget匹配PrDT字段,則PI節(jié)點(diǎn)滿足謂詞。表達(dá)式處理器42將PITarget與PrDT字段進(jìn)行比較(方框506)。如果檢測(cè)到匹配(判斷方框508,“是”支線),則表達(dá)式處理器42將所選擇的條目的eval字段設(shè)置為1(方框510)。表達(dá)式處理器42可以轉(zhuǎn)到下一個(gè)堆棧條目(方框514)。如果希望,表達(dá)式處理器42可以在前進(jìn)之前判斷是否有任何剩余表達(dá)式節(jié)點(diǎn)(判斷方框512)。
值得注意的是,給定堆棧條目可以讓eval字段等于0,讓PrTP字段不等于6、8或A。在這樣的情況下,表達(dá)式處理器42可以轉(zhuǎn)到下一個(gè)堆棧條目(方框514)。
值得注意的是,在一些實(shí)施例中,表達(dá)式處理器42可以被流水線化。例如,節(jié)點(diǎn)的比較可以在比獲取那些節(jié)點(diǎn)(以及對(duì)于具有謂詞的節(jié)點(diǎn),檢查eval字段)稍后的流水線級(jí)進(jìn)行。在這樣的實(shí)施例中,/和//堆棧條目可以包括當(dāng)流水線中存在對(duì)eval字段的潛在改變時(shí)可以設(shè)置的正在進(jìn)行中的位。正在進(jìn)行中的位,當(dāng)設(shè)置時(shí),可以指出條目忙著,以便在進(jìn)行比較之前隨后的事件不會(huì)讀取eval字段。
值得注意的是,在上述各個(gè)點(diǎn),表達(dá)式節(jié)點(diǎn)可以被稱為被推到/堆棧39C或//堆棧39D中。將表達(dá)式節(jié)點(diǎn)推到堆棧39C-39D中的操作可以包括將節(jié)點(diǎn)的表達(dá)式樹(shù)條目300推到堆棧中(或用于表達(dá)式匹配的表達(dá)式樹(shù)條目的一部分)。依照要求,條目中可以包括補(bǔ)充信息(例如,指出匹配的進(jìn)度的各種狀態(tài)變量,如eval字段)。
一旦完全理解了上述說(shuō)明書(shū),對(duì)于那些精通本技術(shù)的人來(lái)說(shuō),很顯然,可以有很多變化和修改方案。下面的權(quán)利要求應(yīng)被解釋為包括所有這樣的變化和修改方案。
權(quán)利要求
1.一種裝置,包括連接為接收文檔的分析電路,其中,分析電路被配置為對(duì)文檔進(jìn)行分析,并生成對(duì)應(yīng)于分析的事件;以及連接為接收事件并將由事件所標(biāo)識(shí)的節(jié)點(diǎn)應(yīng)用于從樣式表中的多個(gè)表達(dá)式派生出來(lái)的一個(gè)或多個(gè)表達(dá)式樹(shù)的表達(dá)式處理器,表達(dá)式處理器標(biāo)識(shí)滿足在一個(gè)或多個(gè)表達(dá)式樹(shù)中表示的表達(dá)式的節(jié)點(diǎn),作為將節(jié)點(diǎn)應(yīng)用于一個(gè)或多個(gè)表達(dá)式樹(shù)的結(jié)果。
2.根據(jù)權(quán)利要求1所述的裝置,進(jìn)一步包括連接為接收滿足一個(gè)或多個(gè)表達(dá)式樹(shù)中的表達(dá)式的節(jié)點(diǎn)的指示的轉(zhuǎn)換引擎,該轉(zhuǎn)換引擎被配置為執(zhí)行對(duì)應(yīng)于滿足給定表達(dá)式的節(jié)點(diǎn)上的給定表達(dá)式的操作,所述操作在樣式表中指定。
3.根據(jù)權(quán)利要求2所述的裝置,其中,分析電路被配置為內(nèi)聯(lián)地對(duì)文檔進(jìn)行分析,其中,轉(zhuǎn)換引擎被配置為通過(guò)存儲(chǔ)器接收指示。
4.根據(jù)權(quán)利要求3所述的裝置,進(jìn)一步包括連接為從所述裝置可與之連接的網(wǎng)絡(luò)中接收數(shù)據(jù)包的處理器,其中,至少某些數(shù)據(jù)包包含文檔,其中,處理器被配置為從數(shù)據(jù)包重建文檔,并將文檔傳遞到分析電路。
5.根據(jù)權(quán)利要求4所述的裝置,其中,處理器進(jìn)一步被配置為執(zhí)行樣式表編譯器,以從樣式表派生一個(gè)或多個(gè)表達(dá)式樹(shù)。
6.根據(jù)權(quán)利要求1所述的裝置,其中,如果第一表達(dá)式的一部分不能被表達(dá)式處理器求值,則表達(dá)式處理器被配置為,如果第一部分被節(jié)點(diǎn)滿足,則將滿足第一表達(dá)式的節(jié)點(diǎn)分組,該組中的每一個(gè)節(jié)點(diǎn)對(duì)于該部分都具有相同值。
7.根據(jù)權(quán)利要求6所述的裝置,其中,轉(zhuǎn)換引擎被配置為對(duì)該部分進(jìn)行求值,并選擇滿足該部分的組。
8.一種方法,包括將樣式表中的每一個(gè)表達(dá)式特征化為,在文檔轉(zhuǎn)換設(shè)備中將樣式表應(yīng)用到文檔的多個(gè)階段的其中一個(gè)階段上是可求值的;以及在特征化時(shí)確定的多個(gè)階段中的所述一個(gè)階段,將每一個(gè)表達(dá)式應(yīng)用于文檔。
9.根據(jù)權(quán)利要求8所述的方法,其中,多個(gè)階段包括編譯階段、分析階段以及轉(zhuǎn)換階段。
10.根據(jù)權(quán)利要求9所述的方法,其中,如果表達(dá)式不包括謂詞,也不包括祖先/后代引用,則表達(dá)式在編譯階段是可求值的。
11.根據(jù)權(quán)利要求9所述的方法,其中,如果表達(dá)式不包括引用了當(dāng)前節(jié)點(diǎn)或后面的兄弟節(jié)點(diǎn)的謂詞,也不包括祖先/后代引用,則表達(dá)式在分析階段是可求值的。
12.根據(jù)權(quán)利要求11所述的方法,其中,如果表達(dá)式包括謂詞或祖先元素引用,則表達(dá)式在轉(zhuǎn)換階段是可求值的。
13.根據(jù)權(quán)利要求12所述的方法,其中,應(yīng)用每一個(gè)表達(dá)式的過(guò)程包括在分析階段中應(yīng)用在轉(zhuǎn)換階段可求值的表達(dá)式的一部分,該部分在分析階段中是可求值的。
14.根據(jù)權(quán)利要求13所述的方法,進(jìn)一步包括根據(jù)將在轉(zhuǎn)換階段被求值的剩余部分,將應(yīng)用該部分的結(jié)果分組。
15.根據(jù)權(quán)利要求14所述的方法,進(jìn)一步包括在轉(zhuǎn)換階段中,對(duì)剩余部分進(jìn)行求值并選擇滿足剩余部分的組。
全文摘要
一種設(shè)備包括分析電路和表達(dá)式處理器。連接為接收文檔的分析電路被配置為對(duì)文檔進(jìn)行分析,并生成對(duì)應(yīng)于分析的事件。用于從分析電路接收事件的表達(dá)處理器被配置為將由事件所標(biāo)識(shí)的節(jié)點(diǎn)應(yīng)用于從樣式表中的多個(gè)表達(dá)式派生出來(lái)的一個(gè)或多個(gè)表達(dá)式樹(shù)。作為將節(jié)點(diǎn)應(yīng)用于一個(gè)或多個(gè)表達(dá)式樹(shù)的結(jié)果,表達(dá)式處理器標(biāo)識(shí)滿足在一個(gè)或多個(gè)表達(dá)式樹(shù)中表示的表達(dá)式的節(jié)點(diǎn)。提供了一種方法。樣式表中的每一個(gè)表達(dá)式被特征化為,將樣式表應(yīng)用于文檔轉(zhuǎn)換設(shè)備中的文檔的多個(gè)階段的某一個(gè)階段是可求值的。在特征化時(shí)確定的多個(gè)階段中的某一個(gè)階段,將每一個(gè)表達(dá)式應(yīng)用于文檔。
文檔編號(hào)G06F17/30GK1910576SQ200480034786
公開(kāi)日2007年2月7日 申請(qǐng)日期2004年10月22日 優(yōu)先權(quán)日2003年10月22日
發(fā)明者卡姆普蒂·V.·卡瑪拉奧, 理查德·P.·特魯吉洛, 丹尼爾·M.·瑟馬克 申請(qǐng)人:科恩格式化系統(tǒng)公司