專利名稱:Xml-機器人的制作方法
發明的領域和背景本發明涉及到一種用來直接執行XML文檔的方法、系統以及裝置,詳見權利要求1和7-9。
XML-基礎XML被定義為SGML形式的一個子集。簡單地說,XML允許按照所謂標注集的方法定義所建立的文檔格式。當前的XML既定義了文檔的物理結構,又定義了文檔的邏輯結構,本發明核心集中在邏輯結構,而在物理結構上使用了預先已有的方法。從物理結構提煉,使用XML來給出文件類型定義(DTD,document type definition)和XML-文檔。使用一個特殊的DTDT來區分XML文檔中哪些關于T有效,哪些無效。簡單的說,所謂DTD T文檔,就是那些與T對應有效的文檔。在邏輯方面DTD定義了元素與特征。每一個該類型的文檔(由DTD方法給出的),所包含的元素和特征的定義情況必須是唯一的,而元素的特征和內容也必須同DTD相匹配。舉個例子,一個DTD T定義了一個元素A,其內容包含元素A的從屬元素X,Y,Z和特征b和c,它在XML里可以被解釋如下<!ELEMENT A(X,Y,Z)><!ATTLIST A b#PCDATAc#PCDATA>在#PCDATA處定義了特征b和c的數據類型。上面用DTD T顯示的A文檔現在包含了元素A的實例。一個元素A的實例包含一個起始標記符<A...>和一個末尾標記符</A>。在起始標記符中,特征被賦值,在起始標注和末尾標注之間,必須給出組成元素的實例。一個T類型文件必須包含如下所示這樣的實例<A b=”string 1”c=”string 2”><X...>...</X><Y...>...</Y><Z...>...</Z></A>其中X,Y和Z實例的準確格式,由對應的DTD T中的元素定義給出。
XML功能的之所以強大,一部分是由于元素組成的定義是允許被遞歸的,為了說明,一些組成可能性被引入并被用來完成上例。在已經使用的序列(X,Y,Z)中顯示了,元素X后跟隨著元素Y,元素Y后跟隨著元素Z,如上例所示。另一個重要的組成操作是選擇(X|Y|Z),它表示對元素X,Y或Z中的一個選擇。其他的操作包括+和*操作,表示一個組件的循環。然而,他們在例子并沒有被使用。假設Y和Z沒有組件(<!ELEMENTY><!ELEMENT Z>),DTDA是通過對X的定義完成的,在這里就使用了對組件的選擇和對元素A的遞歸<!ELEMENTX(Y|A)>。這樣X就是Y或者是A。而A類型可能的文檔就變成現在這樣<A b=”..”c=”..”><Y></Y><Y></Y><Z></Z></A><A b=”..”c=”..”><Y></Y><Y></Y><Y></Y><Z></Z></A><A b=”..”c=”..”><Y></Y><Y></Y><Y></Y><Y></Y><Z></Z></A><A b=”..”c=”..”><Y></Y><Y></Y><Y></Y><Y></Y><Y></Y><Z></Z></A>直到<Y></Y>的無限多次循環。簡單地說,沒有特殊的組件操作像+和*一樣用于上面的循環。<Y></Y>可簡寫為</Y>。
XML是長期標準化的結果,它現在已被廣泛的使用和接受。其現存的應用,按照當前的技術,可以被分成兩個不同的基礎類型數據交換和文檔發布。在數據交換應用中,XML被用來定義數據格式,以便在兩個程序之間交換復雜的數據。此外,在一個相關聯數據庫系統中,XML還被用來作為存儲數據的交換格式。這樣的例子包括XML-data(Microsoft),MCF(Netscape),和RDF(WBC)的格式。在文檔發布應用中,XML是一種理想的數據語言,可以用來構建所有種類的文檔格式。主要的思想是將文檔的邏輯內容放入一個XML-文檔,并將其一般性規劃信息傳給DTD。這種一般規劃性語言的例子包括CSS或XSL。其一般性規劃的輸出可以分別通過HTTP,SPDL,或者Postscript方式。XML處理現存的軟件和應用程序正使用XML來表示數據和文檔,這些文檔和數據隨后被一般目的性編程語言處理。現有的處理XML-文檔的方案可以分為事件驅動和樹操作技術,這與它是否應用于數據交換領域或是文檔發布領域無關。在一個事件驅動的方法中,文檔按嚴格的次序被處理。數據流中的每一個元素都被當成是一個事件觸發器,它會觸發在應用程序中某個部分的某個特定行動。SAX的應用程序接口(API,application programmerinterface)可以被用來在現有的編程語言中實現事件驅動。樹的應用是通過訪問一個結構樹的形式訪問完整的文檔。基本上XML-文檔的元素就是樹的節點。每個元素的組件就是該節點的子節點。常被用來訪問這樣的樹的API是DOM。使用API的不利之處在于,形成了普通用途編程的所有復雜性,尤其是系統和平臺的依賴性、可靠性和安全性而導致軟件的龐大與復雜。一些XML工具通過為數據交換或文檔發布生成專用代碼來掩蓋這種復雜性。盡管它們能夠幫助在傳統編程語言中很容易的生成一個程序模式,但它們并沒有完全從對明確的程序的使用中抽象出來,來引導必須被處理的文件。XML對比傳統性編程與傳統結構概念相聯系的一個重點正如面向對象的程序設計方法一樣。兩種方法使用的都是未結構化的數據源,這可以理解為這樣的數據沒有按某個生成規則給出,比如使用定義的程序結構的XML或是BNF規則的元素定義。這樣的數據源,在傳統編程的情況下,用于與一個結構相關聯,但是卻又獨立于程序。另一方面,面向對象的程序設計方法結合了含有數據目標的結構化程序代碼段。但是目標空間(數據)沒有被結構化在上述的程序中。這樣,當然有可能使用與這些方法相關聯的結構化數據模型。但是,在另一種情況下,由于程序結構獨立于數據結構,從而需要進行像上面所提到的復雜的處理。事實上,在當前對XML-文檔處理的情況中包含了兩個獨立的結構,一個是XML-文檔而另一個是處理它的程序。這種應用主要有兩種不利因素(a)如果一個程序員打算可靠地處理一個DTD在所有情況下的完整結構,這樣的代碼將會由于對應XML-文檔的不同和任務的復雜性而無法完成。(b)處理XML-文檔的程序被典型化設計為處理某一DTD的所有文檔,從而由于代碼的固有一般特性而增加了程序的復雜性。
發明的目的本發明的目的是建立一種方法、系統和裝置,通過將數據和軟件合并到一個整體結構中,來改進對XML-文檔的處理,從而減少或避免復雜性、和/或在數據處理中對編程基本知識的要求以及對現存XML-文檔的再使用。
本發明的另一個目的是提供一種新的并且是全面的方法、系統和裝置來為XML-文檔生成這種整體化的數據和軟件結構。本發明更進一步的另一個目的是提供一種新穎的方法、系統和裝置來直接執行標準化文檔結構,比如說,XML-文檔。發明概述本發明對上述問題的解決在權利要求1和7-9中有詳細解釋。
本發明的思想是基于一種新的方法/系統,在一對并列的整體結構中使用執行軟件和數據。當前本發明可能會被當作是一種應用程序,但是并不屬于上面所提到的應用范疇,如程序交換或是文檔發布。與這些現存的應用程序對比,本發明提供了一種方法和裝置直接執行(或是處理)一個XML-文檔。
當前,發明再使用了現存的XML-文檔結構從而避免了使用一個新的結構和編程概念來處理上述文檔。在本發明的創造性方法中,為每一個文檔定義了一個程序(而不是為每一個DTD定義一個程序)從而大大減少了處理的復雜性。
直接執行XML-文檔的功能,是通過分別定義每一個標識符或每一個代碼的特性和作用,并以此來修飾一個已給出的XML-文檔和/或它的文件類型定義(DTD)而實現的。
通過將程序結構合成指定串/并行控制和數據流的文本格式和/或圖形化流程圖,來實現這一功能。特別是,它是通過將一個XML-機器人的實例化結構應用于一個特定的XML-文檔的方法來實現的。其結果是生成一個可執行的XML-文檔,其中包含了上述XML-文檔的完整執行特征。
本發明的一個最佳實施例是應用了一個獨特而全面性的DTD來具體指定為XML-機器人模塊使用的模塊結構。通過將XML-機器人所給出的程序和規范應用于XML-文檔,就可以來處理一個特殊的XML-文檔。從而,通過直接實現XML-文檔的執行來將各個模塊合并到上述XML-文檔的結構中。在制作中依靠幾個函數(初始的)來定義如何接口和如何修改一個給定的XML-文檔。此外,用一個特定的流程圖來定義上述XML-文檔的執行過程。這些基本的獨創的定義是完整的。在某種意義上來說,按照本發明給出的XML-機器人示例通向直接執行。
本發明的另一個最佳實施例是使用圖像化流程圖(GFC)的方法來提供一個給定的XML-文檔的每一種元素的完整信息。這種GFC定義了分別通過元素和組件的控制流,以及在控制流中執行的動作。當到達GFC的某一狀態時,動作被執行,數據流被發出。GFC的例子包括流程圖,有限狀態機器,狀態圖,UML狀態機器,所有的Petri網,UML動作框圖和其他類型的計算機模型。通過將XML-文檔表示為一個結構樹,本實施例可以用純圖表的方式來定義和解釋,從而為XML-機器人提供一個先進的可視化綜合發展環境。另一方面,連續GFC模型(流程圖,有限狀態機器)按狀態執行動作,這種圖像方法可以直接映射成文本格式方法。此外本實施例可以被推廣到一種允許并行(例如允許平行執行多重動作)和有向動作(如有限狀態機器的轉變運動)的模式中去。本實施例中所有這些不同都可以通過使用GFC在方法中被映射出來。
這兩種實施例的特征在于具有一種模塊結構,每一個模塊用一個特定標記符,如<A...>,來定義所有元素的執行特征,以及這些元素組件的執行特征,此外通過其他標記符,如<B...>,來添加元素所有情況的執行特征。一個模塊中的所有信息,無論是文本還是圖像都與一種描述該類元素的實例(<A...>)相關聯,叫做self元素。在所有方法中,初始值被用來連接外部函數,引導文件/樹結構,涉及某一種元素(<A...>)的所有情況以及定義文檔/樹的附加特征,它的定義已經在一個純函數層中被給出了。如果存在一個將被執行的XML-文檔的DTD,這個DTD明確提供了元素種類存在的特征,以及那些組件現在是屬于這些類的。從而,這樣的一個DTD就為書寫一個XML-機器人規范提供了結構和指導。雖然兩個實施例都不直接依賴于一個的DTD工作,但是還是使用了一個DTD來定義和規范下面所描述的第一種方法。此外,它必須是一個簡單的,源于一個沒有DTD化的XML-文檔的DTD。
在最佳實施例中,其結果由動態創建的和重定義的文檔元素特征/結構樹節點儲存。另外地,基于事件的模式和純函數/聲明的模式可能還是最好的。然而,動態處理信息還是由現存的文檔/結構樹給出更合適。理解這點很重要,即與現存的處理模式相反,XML-文檔或是其結構樹直接被用來當作一個作為XML-文檔的執行特征定義的GFC(或是一個相應的文本格式)的基礎。因此,一個這樣的XML-機器人就是應用XML技術和處理XML-文檔的基本的新方法。
由于本發明沒有限定特定的平臺或具體的處理執行方式,例如現存的API如SAX和DOM,其中給出的規范必須是從具體的形式中抽象出來的。然而,使用的原始部分已被定義以便于執行。更進一步的,本發明的初始值被定義為任意可執行的。而且發明并不限定特定的編程語言來實現流程圖或實現其他的結構,比如,是否生成中間媒介形式/結果,XML-文檔是分別由編譯語言執行的,還是解釋語言執行的,抑或兩者共同執行的。參考附圖對實施例的簡要描述圖1顯示一個名叫“query”的DTD實例圖2顯示一個與圖1所示DTD實例對應有效的XML-文檔圖3顯示圖2所示的XML-文檔的樹型結構,該文檔被包含在圖一給出的DTD“query”中圖4顯示一個圖像化規范,與它的對應的DTD情況見圖1圖5顯示一個規范模塊,其中壓縮了圖4左邊關于“query”元素定義的信息圖6顯示元素“setpoints”和“action”的規范化模塊圖7顯示每個元素定義的局部GFC是如何包含結構樹中一個元素的每一種情況的。圖8顯示如何實現局部GFC同全球層次GFC的連接圖9顯示定義模塊結構的獨特的DTD圖10-15顯示使用流程圖定義一個給定XML-文檔的執行,該文檔使用了與DTD XML-機器人.dtd對應的有效模塊圖16-18顯示圖1所示模塊實例的文本說明圖19a-19b舉例說明一個確定的XML-機器人規范是如何執行的圖20顯示一種實施例的概述,適合于最佳實施例的基于網絡的XML-機器人描述本發明的最佳實施例在下文涉及的
中將詳述。
本發明實現了一個XML-文檔的直接執行。接下來的實施例中描述了對其手段,系統和工具的圖像和文字實現。雖然后面的例子是關于一個已知DTD的XML-文檔的,但是必須理解的一點是,出于考慮到某些不利之處,如不明確的結果,本發明允許在未知DTD的情況下處理XML-文檔。無論何種DTD(如果預先知道)或是XML-文檔都被直接合并成XML-機器人規范(對DTD或XML-文檔的“修飾”)。如上面所描述的,本發明是基本上獨立于具體的媒介(平臺,編程語言,結構化形式如存儲和處理)的。然而,在需要的地方,最佳實施例使用了下面所描述的確定的媒介。
參考圖1至8介紹本發明的第一圖示實施例。
圖1顯示一個DTD例子的元素query,它包含三個組件,兩個是動作類型而一個是query類型的可選擇組件。元素query的特征清單包含一個特征問題,一個必需的特征數據。元素的行動由元素setpoint或query確定。元素setpoint沒有組件只是個單一特征點。
圖2顯示了一個與圖1中的DTD例子對應的有效文檔,在圖1中可查到這個叫做“query.dtd”的DTD。這個實例提供了一個實例文檔,用于在下文中進行更深入的表述。
圖3顯示了一個與圖2文檔相對應的可能的特征結構樹畫法。這樣一個特征結構樹是對XML-文檔的一種選擇性圖像表述。節點1和3是元素query的實例。它們有兩個必需的子行動即s1-行動和s2-行動,而對query子行動并沒有進行選擇。如果要對一個query的子節點進行選擇,即用到S-query。節點2,4和5是元素setpoint的實例,它沒有子節點。在方框中可見它的特征和數值。
圖4顯示了一個DTD的執行規范和DTD實例的執行之間的關系。規格包括純粹的DTD定義和最合適的圖像化流程圖(GFC),以及到達流程圖某一狀態所觸發的動作。左邊的方框顯示了一個DTD執行規范,它被結構化成純DTD組件,圖像化流程圖定義(形象描述)和轉換規則。后者在控制流通過圖表的時候被激活。作為一種選擇,同樣的規范可以應用于沒有DTD的XML-文檔的元素實例。
右邊的方框中圖解了這個結構是如何代表XML-文檔的直接執行的。DTD如果存在的話,就被用來驗證XML-文檔。一個特征結構樹(AST)被建立。GFC被用來修飾這個AST,從而生成一個整體流程圖對應于分解的XML-文檔。文檔的執行是通過執行GFC完成的,例如,與GFC特定狀態相關的動作觸發和伴隨GFC狀況的控制流處理。
一個完整的執行規范被結構化成許多規范模塊。每一個規范模塊對應于一個描述元素執行特征的元素聲明,和附加的該元素組件的執行特征以及其他元素類的實例。
圖5給出了一個例子,顯示了圖1中query元素的規范模塊。模塊最上面的部分包含了相關的元素和特征定義。中間部分給出了一個GFC段,它指定了元素query實例的執行特性。GFC段用圖像表述的最佳方法給出。最后,在圖5的底部顯示的是轉換規則。
現在詳細說明一下在圖4和圖5中涉及的,對圖1DTD示例的最佳圖像表示方法。例子描述了伴隨連續控制的GFC,與有限狀態機,狀態圖,正規流程圖,或UML狀態機相似。分散的GFC工作程序同Petr1網的變量,或UML動態圖表類似。在這種方法中一個XML-文檔的執行特征,由一個連續的,其狀態與動作相關聯的圖像化流程圖給出。在選擇性實施例中,GFC的箭頭可以代表動作。在當前示例的實施例中,處于GFC的任意狀態下,當一種狀態轉變成下一種狀態時,相應的行動就會被實施。同其他的基于狀態的形式體系中(如Harel’s狀態圖)相似,當前的GFC控制箭頭可以用布爾變量標志,它被用以監測控制流來確定標注為何被省略。一個沒有標注的控制箭頭有其缺省特征,例如,如果從箭頭源中引出的其他箭頭都沒有被設為真,那么無標注的箭頭就為真。
一個如圖4左邊所示的DTD特征規范中包含三個部分DTD的自身定義,一個代表GFC的可視化的符號,以及動作規范。另外可能還有一個在制作前計算附加特性的規范,它可能以函數形式給出。還有安全條件,由DTD和附加導出特征規范做出的特征定義給出。DTD被用來生成一個剖析算法,然后按照規范的方法將被剖析的XML-文檔繪制成一個AST。規范的第二部分描述了與GFC狀態轉變相關的控制流。關于DTD聲明中每一個元素的圖像化描述,定義了一個局部GFC,并進而指定了該GFC如何通過一個AST修飾嵌入到全局GFC中去。這一部分的最后,AST的每一個節點都被一個GFC段復本的圖像說明所修飾。一個節點的子部分引用,定義了一個全局GFC的相應結構,在下面(如圖7和8)解釋了它的執行。最后一部分包含轉換規則,指定在文檔執行過程中的動作的觸發。GFC的任何一個狀態都同一個轉換規則對應,當到達這一狀態時,就會套用該規則。GFC的轉化是有條件的,其條件是從AST節點中建立的。
圖5的GFC包含了一個圓形節點,它代表名叫“ask”的狀態。如果到達這個狀態,在模塊中最下面所示的相應的行動就會被觸發。之后,控制信息將會流向標有S1-action的框圖或是標有S2-action的框圖,具體流向由箭頭上標注的條件決定。框圖表示了對應于子節點的GFC,這些子節點由標簽引用。I和T箭頭表示控制流的入口和出口。
在第一實施例中,像后者所描述的一樣,I和T被看作是一種標準狀態叫做“起點initial”和“終點terminal”。此外,進入框圖的箭頭必須被明確指向框圖的“initial”狀態,而離開框圖的箭頭必須從框圖的“terminal”狀態離開。聯系圖1至8,用文本格式表示GFC,這樣的對應關系就很容易理解。
圖6顯示了圖1中的DTD示例的模塊action和setpoint的規范。Action就是在setpoint和query中做選擇,從而它繼承了這些元素定義的GFC定義。setpoint元素模塊引入了一個僅包含一個狀態的微型GFC,它的響應動作就是增加一個點計數器的值,具體增加的數值是由特征點給出的。
如注釋,每個規范模塊中的可視化符號包含了的局部GFC的信息,該GFC是同AST的每個節點相對應的,而該AST是與規范模塊,以及將這個GFC嵌入到對應輸入文檔的全局GFC中所需的信息相對應的。
圖7顯示了來源于每個圖像化表述的圖像化片段是怎樣與示例文件的AST節點建立連接的。并且舉例說明,通過將圖5和圖6所示的GFC同AST相應的節點相匹配,一個全局GFC是如何被一個AST所包含的。一個中間包含了模塊query(如圖5)的GFC片段的兩個實例,和模塊setpoint(如圖6)的微型GFC片段的3個實例。本圖再次用圖像表示法顯示了對每個AST節點的修飾。這種圖像修飾可以更好的獲得控制流。然而,必須理解的是,本發明也可以應用于其他情況,即用文本程序指令或其他手段來取代本例中的用圖像化流程圖所獲得的控制流和動作觸發。
圖8顯示了一個由這些片段相互嵌套形成的分級GFC。圖7中的GFC片段包含了引用子節點的框圖,通過分解這些引用來完成嵌套。
在接下來的說明書中,將對用于控制流的可視化符號,給出一個更詳細解釋。在說明書模塊中使用的圖像化符號的含義可以被表述如下有兩種節點橢圓框和方框。橢圓框表示GFC的一般狀態。同時他們還標有一個動作名,該動作(由轉化規則指定)在到達該狀態時被激發。方框圖對應特殊的狀態,這些狀態自身就是GFC。另外方框還同AST節點相對應。這種GFC中的特殊狀態和AST中的節點之間直接的一一對應關系是,AST結構和執行特征結構的標識的詳細方法。當然,被描述的方框的用途,對它們的組件的引用以及結構之間一一對應的關系,都是獨立于GFC,流條件以及行動的具體構成的。
方框圖就是GFC,它對應著元素定義右邊的組件。這些GFC的定義是由分別對應各個元素的說明模塊給出的。箭頭指向生成的GFC的分級狀態轉化圖框的邊緣。箭頭的來源和目標可以是橢圓框或方框。除此以外,還有兩個箭頭,一個的來源被標志為I(作為起點),它的目標是一個方框或一個橢圓框,另一個的目標被標志為T(作為終點),它的來源是一個方框或橢圓框。標志有I的箭頭代表局部GFC的輸入端,標志有T的箭頭代表其輸出端。一個向GFC特殊狀態的轉變引發了一個輸入,進入這個特殊狀態的GFC的第一個狀態(由箭頭I標志)。在每個規范模塊的可視化描述中,方框是對相應的GFC的引用。對圖7所示的被修飾的文檔例子的引用進行分解,生成了如圖8所示的GFC。所生成的這個分級GFC給出了XML-文檔的執行特征,并且該分級GFC的直接執行是可能的,從而允許直接執行XML-文檔。直接執行XML-文檔的能力并不依賴于特定的,在最佳實施例所顯示的那一類GFC,任意形式的GFC都適用。
在例子所示的GFC的形式中,就像在狀態圖中,從初始狀態進入一個分級狀態,由一個箭頭I來表示。如果到達末狀態(由輸出箭頭T標志),那么就實現了向一個高一級狀態的轉化。
這樣一個如圖8所示的分級GFC的工作如下。控制進入結構樹的根部,例如,節點1。相應的GFC的初始狀態就是節點1中的詢問狀態。這個節點中的問題是“Is Paris the Capital of France?”。在觸發了詢問行動之后,就要給出回答“是”或“否”。如果回答等于“是”,控制沿著上面一條控制箭頭離開詢問狀態,進入特殊狀態2。特殊狀態2的起始狀態和末端狀態是固定動作。當執行了固定動作之后,離開特殊狀態2,訪問子節點(任意的,事實上不存在的)S-query,并不觸發任何動作,就離開了特殊狀態1。如果在特殊狀態1的詢問狀態中回答“否”,就進入了特殊狀態3,特殊狀態3的初始詢問狀態被訪問。這次提出的問題是“Are you sure?”。如果答案堅持“是”,點計數器就被置為0,反之則置為1(特殊狀態4和5)。
在發明的最佳實施例中,使用數據塊的方法來處理上述狀態。動作的轉化規則重新定義了這些數據塊中每一點的內容。通過假設一個必要的編程系統的簡單模型,將有助于更好的理解它。系統狀態由一個多維數據庫給出。數據庫包含了n-維塊。一個n-維塊f的內容可以從下面的條件f(t1;:::;tn)讀出,其中t1;:::;tn是建立在數據庫塊基礎上的條件。一個一般變量對應一個0-維塊,反之一個列和記錄集可以被模型化成1-維塊。
可能儲存在塊中的數值會包含很多常見的數據類型像整型、實型、布爾變量或其他在一個特定應用中需要的類型,例如結構樹節點或動態生成的對象。結構樹節點的特征被模型化成一維塊,而節點n中特征a的值可以通過條件a(n)得到。為了方便,在特征語法和面向對象的程序中使用了點這個符號,例如用n.a來替代a(n)使用。
舉個例子,一個基本的更新規則的形式如f(t1;:::;tn)=v,其中f(t1;:::;tn)和v都是基于系統中塊建立的條件。這個規則的含義是通過對v進行調整,來更新塊f。規則可以由串接或是并列的方式組成,以便于一次執行完相應的更新。除了上面提到的基本轉化規則之外,還可以存在其它的轉化規則,例如依靠布爾變量的條件來激活的條件化規則,允許對所有某一類元素使用同樣的規則的全局有效規則,允許從一類元素中選擇其中的一個的選擇性規則,而最后是用來引入新的元素的擴展規則。轉化規則是在這些規則之上遞歸建立的。
下面詳述轉換規則的執行過程,依然是引用圖8。用圖5和圖6的圖像化表述中的動作規則來描述簡單程序的執行是可能的。初始狀態是一個被標志為動作ask的簡單狀態,它的入口在屬于AST根節點的圖像片段中,由箭頭I標出。詢問動作在前面所提到的query-模塊(如圖3)中指定,其結果是將問題打印出來,可用的特征問題是“Is Paris the Capital ofFrance?”。然后獲取一個用戶輸入(例如get(stdin))并將特征答案作為輸入。這個動作之后規則就被執行了,從這個狀態出發的輸出箭頭情況被確定。從詢問狀態引出兩個箭頭,一個標志著條件答案=“是”,另一個標志著條件答案=“否”。根據答案的值選擇相應的箭頭,通向特殊狀態節點2,或是特殊狀態節點3。假定答案是“否”,那么就要沿著下面的箭頭,進入特殊狀態3。因為這是一個特殊狀態,它導致一系列的轉化,這些轉化是沿著組成該特殊狀態的流程圖進行的。在這種情況下,進入這個特殊狀態的初始狀態還是一個用橢圓表示的簡單狀態,它也再一次被標志為動作ask。這一次打印出來的特征問題是“Are you sure?”,根據用戶的答案的不同,接下來將緊跟著節點4或節點5。這些節點就是特殊狀態,它包含一個被標志為動作set的單一狀態。該動作把由得分特征確定的得分值添加到0-維塊中去。這樣,在初始問題中回答“是”的用戶得到10分,一個先回答“否”,又選擇了“是”的用戶得0分,第一次回答“否”而第二次回答“否”的用戶得1分。按照生成的GFC結構,第一次回答了“是”的用戶就不會被問及第二個問題。
更抽象一些,一個XML-文檔被執行,是通過像上面敘述的那樣,通過生成它的GFC,然后從它的根元素的初始狀態(或同時執行的狀態)開始。初始狀態是在特殊狀態的入口,對應文檔的根部,順著箭頭I。如果箭頭I指向一個普通的狀態,就進入這個狀態,否則就沿著箭頭I按遞歸原則向下走。如果初始狀態被進入,那么它的動作就被觸發。然后評估流出控制箭頭上的條件,選擇符合條件的一個箭頭(或同一情況的多個箭頭)。如果該箭頭指向一個一般狀態,該狀態被執行,程序被重復。如果箭頭指向一個特殊狀態,沿I-箭頭遞歸向下,至下一個狀態執行,程序被重復。如果箭頭是一個T箭頭,那么退出特殊狀態,選擇一個擁有合適條件的特殊狀態輸出箭頭。然后像上文所描述的那樣沿該箭頭進行下去。
這樣,一個XML-元素定義的動作組成,可通過圖像化和/或文本化的,連續或并行的控制和/或數據流程圖來表述。特殊的文本化和/或圖像化方法被用來代表XML-元素定義的組件,允許組件動作同步或不同步執行,以便于由每個元素定義中的組件給出的文檔結構,在由組件動作的觸發給出執行結構中能被直接再使用。此外,特殊的、被用來定義動作成分的連續或并行的執行順序的圖像化和/或文本化方法,和用來保證指定順序的執行路徑的條件一起給出。這些特殊的圖像化和/或文本化方法可能被包含在條件和行動的定義中,或定義合并行動的節點引用中,用來引用它的組件,和引用它的特征,組件和特征由XML-特征定義給出。
參考圖9到18為對本發明第二文本實施例的描述。
圖9顯示了發明中表示XML-文檔執行特征的XML-機器人模塊的特殊而全面的DTD。在下文圖9ff的引用中,對一個用文本實現發明的實施例進行了更詳細的描述。為了描述圖9ff,所必需的語法和主要的函數將首先在下面被定義和解釋。下面的定義其重點集中于文本化(基于文本的)實現。
一個要被執行的XML-文檔名叫“doc.xml”,而XML-機器人由文檔所定義,如果元素名為X,給出的文件名就為“moduleX.xml”的。此外,假定所有這些文件可以被圖10ff所示的流程圖隨意替換,來解釋doc.xml的執行。執行的狀態內包含了上面提及的文檔,以及十一個全局變量,分別命名為cur,mod,state,derived,subcur,submod,curstate,action,trans,src,和trg。通過新建和重定義特征,通過將元素狀態模塊傳送到文檔“doc.xml”中去,執行改變了上述給出的文檔。此外在執行中重定義(更新)全局變量的值。例如,如果在當前執行狀態中,變量cur的值為v1,執行更新cur=v2的結果就是進入了一個新狀態,在該狀態中變量cur的值為v2。在前面的定義中,全局變量的值在XML-文檔中或由undef中給出。
前面所描述的標準化結構被用來處理XML-文檔,其中的元素的起始和末尾的標注形式如<A...>...</A>。元素的引用即文檔中的指示器。引用的實現,可以通過(a)使用文本定位(如果過多的文本被粘貼到文檔中將會促進它們的更新),(b)在XML-鏈接定義中現存的引用機制,(c)指向在XML-結構樹的一個目標模型中的目標的指示器,如DOM,或是在使用GFC的實施例中描述的樹。
為了更好的理解執行過程,重點將集中于上述元素的特征。舉個例子,一個元素A的特征aa通過如下語句賦值為“13”<A aa=“13”>...</A>。為了讀出特征值,給出了一個函數evalAttr(_,_),有兩個變量,分別代表一個元素名和一個特征名,并返回一個特征的值。假設doc.xml包含上述元素A,r是這個元素的引用,條件evalAttr(r,“aa”)被賦值為“13”。語句“r.evalAttr(“aa”)”,同evalAttr(r,“aa”)等價,其他動作的類似語法也被用于圖10ff中,以方便描述。
在下面這一段中描述的XML-文檔的執行,需要動態更新和/或創建的特征。這樣,就給出了一個函數setAttr(_,_,_),它包含3個變量第一個是一個元素的引用,第二個是一個特征名,第三個是要被更新(新建)的新的(初始的)特征值。例如,動作r.setAttr(“aa”,“15”)將文檔doc.xml中,上述被r引用的元素A,變為形如<A aa=“15”>...</A>。一個動作r.setAttr(“bb”,“7”)變換文檔doc.xml中r所引用的元素為形如<A aa=“15”bb=“7”>...</A>。如果這兩個動作被按任一次序觸發,其結果都是使r所引用的元素形式變為<A aa=“15”bb=“7”>...</A>。在這一方法中,被引用的元素是物理文檔的一部分,如doc.xml。對上述元素的變換將造成XML-文檔的破壞性的、不可逆的變化。
此外,除了XML中存在的標準值v以外,像字符串和數字,特征還可以通過引用文檔中(其他)的元素來賦值,例如,在上面例子中的引用r。正如所提到的,這樣的引用可以通過不同的方式來實現,動作r1.setAttr(a,v)的執行使得條件r1.evalAttr(a)的狀態值被定為v,直到另一個動作r1.setAttr(a,v’)被觸發,它基于同一個元素,同一個特征,但有不同的值v’。
動作“Pasteinside”被用來把文本粘貼進一個XML-文檔。它有兩個變量,第一個代表一個元素,而第二個是要被粘貼的文本。文本被粘貼在指定元素的起始標注之后。再次使用引用r,動作r.Pasteinside(“textsample”)將doc.xml中元素A的引用變換成了如下形式<A aa=“13”>textsample...</A>
動作“Copy”被用來在引用中添加一個字符串。再次使用指向doc.xml中元素A的引用r這個例子,條件r.copy定義字符串為“<A aa=13>...</A>”,它與元素引用的語法相同,但物理結構不同。如果這個元素被復制,元素特征保持不變,但被復制元素的引用僅指向復制源。
上述動作Pasteinside和Copy被用來從一個文檔中復制一部分到另一個文檔。給出兩個文檔doc1.XML<A>
<B><A></A>
</B>
</A>doc2.XML<C>
<D><C a=””12””b=””2””>
<D></D>
</C>
</D>
</C>和引用r1指向文檔doc1.XML的元素B。r2指向doc2.XML的內部元素C,動作r1.pasteinside(r2.copy)導致了一種變換doc1.XML<A>
<B><A></A>
<C a=”12”b=”2”>
<D></D>
</C>
</B>
</A>doc2.XML保持不變。元素C的特征被r2引用,是復制的,但是在doc2.XML中的引用沒有改變。
給出一個物理文檔,例如,文件doc.xml(或者模塊XYZ.xml的一個文件),條件getRef(“doc.xml”)得到一個對文件根部的引用,例如,最外一層的一對開始/結束標注符。此外,條件r.getLabel得到被r引用的元素的名稱。在上面的關于doc1.XML和doc2.XML的例子中,r1.getLabel得到了“B”而r2.getLabel得到了“C”。
XML-文檔內的定位用函數getFirst(_,_),getNext(_),和parent(_)。這3個函數的第一個變量是一個由引用r給出的XML-文檔中的一個內部元素的引用,例如,r.getFirst(″A″)為在r的開始和結束標注之間的第一個直系元素引用定值。沒有考慮嵌套的情況。在doc1.XML和doc2.XML的例子中,引用r1可以通過使用條件函數getRef(″doc1.XML″)獲得,引用r2可以通過使用條件函數getRef(“doc2.XML”)獲得。
如果沒有所要求名字的元素,getFirst會按undef確定。此外getRef并不涉及嵌套的元素。在上面的例子中,getRef(doc1.XML).getFirst(″A″)并沒有得到在內部A元素的引用,而是得到undef中的定義。為了得到內部A元素的引用,必須使用getRef(doc1.XML).getFirst(“B”).getFirst(“A”)。
如果存在這樣一個元素的話,函數getNext(_,_)返回下一個有同樣標記的元素的引用,否則就返回undef。下面給出一個XML-片段的引用。<A>
<B x=”1”></B>
<B x=”2”><B x=”3”></B></B>
<b x=”4”></B></A>引用r.getFirst(”B”)取出B-元素的x=”1”,引用r.getFirst(”B”).getNext取出B-元素的x=”2”,引用r.getFirst(”B”).getNext.getNext取出B-元素的x=”4”,為了取出B-元素中的x=”3”,就必須寫成r.getFirst(”B”).getNext..getFirst(”B”)。
函數“parent”對一個元素的引用映射到最小封閉元素的引用。在doc1.XML和doc.XML的例子中,r1.parent=getRef(“doc1.XML”)而rl.parent=getRef(“doc1.XML”)。
函數“<CopyList(_,_)”的第一個變量是一個引用,第二個變量是一個元素名。r.CopyList(a)將r中所有直屬的(不是嵌套的)元素A集合成一個字符串。因此,在上面所舉的getNext例子段中,r.CopyList生成了一個字符串“<B x=”1”></B><B x=”2”><B x=”3”><</B></B><B x=”4”></B>”,包含3個B元素,其中第二個包含了一個相同的而嵌套的B元素。
最后給出的是函數traverse。從根部的說明開始,traverse按某種順序列舉了文檔中所有的元素。
現在,在圖9中,定義DTD的模塊。這個DTD中的元素在下面逐一被解釋。有代表性的是,模塊是由不同的模塊文件給出。當然,DTD必須由唯一的根元素來完成。然而,一個有所有模塊清單的完整語言可以被一個DTD包含。最上端的模塊元素就是這些模塊文件的根部。
一個模塊的組件包括一個導出特征清單,一個選擇表達式,一個狀態清單和一個模塊清單(下級模塊)。名字特征告訴元素哪個模塊是可用的。定義是基于假設在當前被處理文檔中有一個元素“X”,這樣的XML-文檔名為“moduleX.xml”,它的根元素是一個“module”元素,上述根元素有一個“name”特征,它的值是“X”。
<!element module(derived*,expression?,state*,module*)>
<!attlist module name CDATA#REQUIREDnumber CDATA“1”>
導出特征的清單中包含特征定義,這些特征定義由調用其他特征定義的函數給出。選擇表達式給出一個安全條件,該條件必須在該一個元素的每一種情況中實現。狀態清單指的是這樣一個元素的每一種情況的(非嵌套的)狀態。最后,模塊清單指向元素的每一個模塊,其中的每一個下級模塊都包含狀態和更下一級的模塊。對下級模塊而言,其數字特征表示它代表那一種情況。如果它代表第一種情況,數字值就定為“1”,等等。如果它代表所有情況,數字值就定為“all”。
<!element derived(argument*,expression)>
<!attlist derived name CDATA>
<!element argument EMPTY>
<!attlist argument name CDATA>
一個導出特征定義由兩個部分組成變量,在定義和當前的定義中用到的,由表達式的形式給出;名字特征,給出了導出特征名。一個導出特征通過確定變量值和給定義表達式賦值來確定其屬性。
一個狀態的組件包含一個動作清單,如果到達該狀態就被觸發;和一個從該狀態出發的轉化清單。狀態名被用來作為某些轉化的目標來引用。<!element state(action*,transition)><!attlist state name CDATA>
一個轉化有兩個組件,一個是表達式,用來對轉化提供保護;另一個是路徑,用來指示轉化的目標。所有導出函數的表達式,路徑,動作和定義取決于它們的初始端,即模塊的根,也就是在將被執行的XML-文檔中它的各個情況。<!element transition(expression,path)>
一個路徑包括一個選擇性組件,和一個特征狀態。狀態表示了路徑指向的狀態的名稱。典型的狀態如表示初始狀態的“initial”,和表示結束狀態的“terminal”。組件指向被嵌套的組件,特征數字再一次表示被選擇的實例。如果數字的值是“all”,路徑就對應指向所有實例的路徑集合。<!element path(component?)><!attlist path state CDATA“initial”><!element component(component?)><!attlist component name CDATA #REQUIREDnumber CDATA“1”>表達式有不同的使用情況,其定義如下<!element expression(path|self|src|trg|evalattr|getfirst|getnext|parent|root|apply|external|constant)>
path被用來表示是對應元素而不是對應引用路徑的狀態。Self表示該元素是包含了使用自身的定義的模塊實例。Src如果在動作中使用,表示了包含最后被執行的狀態的元素;如果在轉化中使用,表示包含轉化來源的元素。Trg表示包含轉化目標的元素。Evalattr,getfirst,getnext,parent表示上面提到的對應的主要函數。root表示被執行文件的根部。Apply被用來固定二元的和一元的操作,像數學運算(+,-,*,...),布爾量運算(和,或,否,...)和字符串操作(添加,合并,...)。External被用來調用由任意的編程語言寫成的外部函數。最后,constant被用來表示常量,像數字,布爾量和字符串。
在流程圖中,一個抽象函數evaluate(_)被用來對元素的表述進行評估。
如果達到一種狀態,那么就觸發動作,且它們具有這種結構<!element action(setAttr|ifthen|forall|external)>
該setAttr動作符合上面所描述的setAttr基元。使用ifthen來執行只有滿足某些條件的某些動作,而使用forall來執行文檔中某一要素所有狀態的動作。該external結構再次用來調用擴展函數。
在流程圖中,使用一個抽象程序execute(_)來執行動作要素。
既然定義應當獨立于表達式和動作語法的具體選擇而有效,按照圖9所得的DTD使用起始于帶有要素<!element src EMPTY>的第19行的剩余行來完成。
關于圖10~16,將更加詳細地解釋一個給定的XML-文檔doc.xml的執行。圖10~16顯示六張固定的流程圖F1、F2、F2、F3、F4和F7,它們規定了執行過程。與首選方法的語言環境中所描述的GFC的執行過程相比較,這些流程圖并不依賴于需要執行的文檔和機器人-模塊,但對任何文檔和任何機器人-模塊來說,都是固定的。每張流程圖引用一個給定的、即將執行的XML-文檔doc.xml的一個執行邏輯塊。作為獨立的文件moduleX.xml,為每一要素-名稱X提供模塊。使用[Fx.Sy]來引用每一張流程圖Fy的狀態,此處的x表示流程圖的編號,而y表示相應的流程圖中的狀態編號。
按照本發明,首先遍歷XML-文檔(或在其它實施例中的一個DTD),而且來自模塊的所有狀態和轉換都被復制到XML-文檔中。隨后,獨立執行XML-文檔。在復制過程中,設定每一狀態的“origin”特征為當前轉換的要素,例如,來自已經觸發復制動作的要素。因而引用初始特征值給doc.xml的要素。
在所示的圖10中,執行的初始狀態是[F1.S1]。全局變量cur的值設定為引用文檔“doc.xml”的根目錄。然后控制轉向狀態[F1.S2],設定全局變量mod的值為引用描述根目錄執行特征的“module”要素,例如,具有相應的cur標記名稱的模塊。然后,控制轉向流程圖F2的狀態[F2.S1]。F2的作用是將所有“state”-和“derived”-要素從模塊mod復制到要素cur,設定所有狀態和派生的特征“origin”為cur。控制從F2的最終狀態[F2.S99]轉向F3的初始狀態[F1.S3]。F3的作用是將模塊mod的子模塊的“state”-和“derived”-要素復制到要素cur的相應部分,仍然設定所有狀態和派生的特征“origin”為cur。控制從F3的最終狀態[F3.S99]轉向[F1.S3],將cur更新為cur.traverse。接下來,決策[F1.S2]依賴條件cur=undef而分叉。如果條件估算為真,終止遍歷,并將控制轉向[F5];否則,控制返回到[F1.S2]。
模塊F5可能包含附加程序,用于處理嵌套在嵌套模塊中的模塊和校驗安全條件。僅僅在特殊的裝置中使用的這些程序,可能使用標準過程結構來執行。控制從[F5]轉向[F6]。此外,只為特殊裝置使用模塊F6,而且F6包含根據不同策略記錄的狀態、轉換和派生特征,例如轉換中關于條件的參數選擇和執行的類。控制從F6轉向F7的初始狀態[F7.S1]。
作為注釋,F2(圖11)的作用是將模塊mod的“state”-和“derived”-要素復制到要素cur,并設定這些要素的“origin”-特征為cur。不是先復制要素再設定特征,而是先設定特征為模塊mod中的正確值,然后將這些“state”-和“derived”-要素從模塊mod復制到要素cur。使用全局變量state遍歷mod中的“state”-要素,而使用全局變量derived遍歷“derived”-要素。初始狀態[F2.S1]設定變量state為mod中的初始“state”-要素。接下來,控制轉向[F2.D1],而且,如果state=undef,控制從那兒轉向[F2.S3];否則轉向[F2.S4]。在[F2.S3]中,如果state不等于undef,那就到達[F2.S3],設定state的特征“origin”為cur。控制從那兒轉向[F2.S3],設定state為state.getNext。控制再次從那兒轉向決策[F2.D1]。在[F2.S4]中,所有“state”-要素復制完后,就到達它,設定全局變量derived為初始“derived”-要素。同“state”-要素一樣,決策[F2.D2]依賴條件derived=undef而分叉;而且,狀態[F2.S6]觸發derived=derived.getNext,使用[F2.S6]來迭代遍歷所有“derived”-要素,在[F2.S5]中,設定“origin”-特征為cur。如果迭代終止,控制轉向[F2.S7],將deriveds的完整列表傳遞給cur。接下來,在[F2.S99]中,將“state”-要素的列表從mod復制并粘貼到cur中。
在F3(圖12)中,使用迭代變量submod來訪問mod的所有子模塊。如果迭代終止,例如如果決策[F3.D1]估算出submod等于undef,那么將控制轉向F3的最終狀態,[F3.S99]。否則,控制轉向[F3.S2],在這兒設定變量subcur為第一個部件,它的標記與子模塊submod的標記相匹配。如果子模塊submod的“number”-特征是“1”或“all”,那么正確地設定subcur為初始狀態,并將控制從決策[F3.D2]轉向F4的初始狀態,[F4.S1]。否則,設定[F3.S3]中的subcur為下一種狀態,并將控制轉向決策[F3.D3],它檢查subcur是否等于undef。如果不等于,那么假定必須檢查第二種狀態或者所有狀態,并再次將控制轉向狀態[F4.S1]。F4的作用與F2的作用正好一樣,但是不是用mod和cur,而是使用submod和subcur,除了設定“origin”的特征為cur以外。
控制從最終狀態[F4.S99]轉向決策[F3.D4]。如果分支條件估算出子模塊submod的“number”-特征是“all”,那么控制轉向[F3.S3],用正確的標記遍歷所有狀態。如果遍歷停止,那么通過觸發決策[F3.D3]為真,或通過在決策[F3.D4]中尋找數目不是“all”,來繼續訪問狀態[F3.S4]中的所有子模塊。在這兒設定submod為“module”-要素的下一種狀態。控制再次從[F3.S4]轉向決策[F3.D1],注明一下,它要么繼續訪問子模塊,要么將控制發送到F3的最終狀態,即[F3.S99]。
按照上面所述,F4(圖13)的工作原理同F2完全一樣。使用變量state和derived來迭代遍歷模塊submod的“state”-要素和“derived”-要素,設定它們的“origin”-特征為要素cur。然后將所有“state”-和“derived”-要素復制并粘貼到要素subcur中。
在狀態[F4.S99]中,將所有“state”-和“derived”-要素復制并粘貼到文檔doc.xml的相應要素中,并設定“origin”-特征,這樣就不再需要那些模塊了。既然只需設定狀態的一種特征,且所有的“transition”-、“action”-和“derived”-要素是并保留原封不動,一種可供選擇的辦法是只復制“state”-要素和“derived”-要素最外面的部分,并引用其余模塊。
在所示的圖14中,流程圖F7的初始狀態[F7.S1]表示了實際執行階段的開始。在F7中,觸發與當前狀態curstate相匹配的所有狀態的動作。設定cur返回到文檔doc.xml的根目錄。然后將控制轉向[F7.S2],在此處將全局變量curstate設定為“initial”。變量curstate的作用是指明當前要素cur內部的當前狀態。在[F7.S3],[F7.D1]和[F7.S9]中,通過變量state來迭代遍歷當前要素cur的所有“state”-要素。初始化迭代[F7.S3],[F7.D1]是終止條件,如果它終止,就發送控制給[F8.S1];[F7.S9]是實際迭代程序,它設定state為“state”-要素的下一種狀態。在迭代內部,決策[F7.D2]用來校驗state的“name”-特征是否與當前狀態curstate相匹配。如果匹配,接下來訪問[F7.S4],設定變量cur為state的“origin”特征值。該更新的作用是估算右邊的動作。在[F7.S5],[F7.D3]和[F7.S7]中,通過變量action來迭代遍歷state內部的所有動作,并在[F7.S6]中執行它們。當迭代終止時,控制轉向[F7.S8],在這兒重新設定cur的值為其初始值。states的迭代從那兒重新開始,終止后通向[F8.S1]。
最后,如圖15所示,在F8中,觸發轉換,更新當前要素cur和當前狀態curstate。轉換條件的估算取決于它們的定義的初值、轉換的源-要素src和轉換的目標-要素trg。在表示條件的“expression”-要素中,這三個要素可以分別作為<self/>、<src/>和<trg/>來訪問。在流程圖F8中,兩個嵌套的迭代代替了“state”-要素和其“transition”-要素。初始狀態[F8.S1]設定src等于當前要素cur。接下來,[F8.S2]、[F8.D1]和[F8.S9]迭代變量state來遍歷當前要素cur的所有狀態。如果迭代終止,控制返回到[F7.S3],再次執行同樣的動作。否則,[F8.D2]校驗state的“name”-特征是否與當前狀態curstate相匹配。如果匹配,那么進入[F8.S4],并設定變量cur為state的“origin”特征值。接下來,使用[F8.S5]、[F8.D3]和[F8.S8]來迭代變量trans遍歷state內部的所有轉換。在迭代內部,[F8.S6]設定trg等于估算通路的結果。接下來,[F8.D4]驗證trans的表達式是否估算為真。必須指出,對于該估算來說,必須正確地設定cur、src和trg。如果估算的結果為真,那么設定cur等于trg,并將curstate設定為trans的通路-組件的“state”-特征。然后控制轉向[F7.S3]。目的是為了執行新當前要素和狀態的動作。
在圖16、17和18中,顯示了按照圖1ff而定的詢問程序語言例子的模塊。這些模塊關于圖11給出的DTD來說,是有效的。示例XML-文檔的執行可以使用圖12所述的過程來完成。根據上述的圖象化流程圖,可以自動從圖象化輸入生成上面所說的模塊。另一方面,可以從這兒給出的文本形式生成它們的圖象化表示。
關于圖19a-19d,XML-機器人規范的執行,它按照上面的解釋給出了XML-文檔的執行特征,這兒將更加詳細地描述它。給定XML-機器人規范m0,寫入XML-機器人規范語言M,如上面所描述的可視化/文本化詢問程序語言那樣,以及關于m0的文檔類型定義DTD0有效的XML-文檔d,執行規范給出關于抽象過程m0Exec(d)為了執行d將做何動作的所有信息。為了執行抽象過程m0Exec(d),需要在現存的計算機上執行一個程序,例如,按程序化語言C或Java書寫的一個程序。這兒有四種基本方式來執行上面所說的程序。
在圖19a-19d中,以方框的形式顯示所有過程,以普通方式顯示文檔,即一個帶曲線頂邊的方框和一個可執行文檔,例如,一個程序顯示為一個文檔和一個過程的結合,如程序的執行。每一過程可能有一個以文檔形式的輸入,有一個以文檔形式的輸出,并且它可能是另一過程的開始。可以在一臺真實的機器上執行的具體過程,顯示在實線方框中;而抽象的過程,如過程m0Exec(d),顯示在點劃線方框中。所描述的執行XML-機器人的可能性是通過編譯器和解釋器技術的不同組合來實現的。可以為元形式記法M和形式記法DTD0使用兩種技術中的一種。因此,通常有四種組合形式,編譯器后跟解釋器(圖19a),編譯器后跟編譯器(圖19b),解釋器后跟解釋器(圖19c),以及解釋器后跟編譯器(圖19d)。
圖19a顯示,通過從XML規范m0生成一個解釋器IntDTD0的一種執行方式。解釋器IntDTD0選用XML-文檔d作為輸入,并校驗它關于DTD0是否有效。隨后它啟動執行這樣一個文檔d的過程,以這樣的一種方式進行該過程與上面所介紹的抽象過程m0Exec(d)等效。通過一個可執行文檔IG給出執行,它的執行選用XML-機器人執行規范m0作為輸入,并生成一個可執行文檔intDTD0作為輸出,即所說的解釋器。
圖19b顯示另一種可能性,它提供一個編譯器生成程序,通過一個可執行文檔CG給出來,該CG從XML規范m0生成一個編譯器CompDTD0。編譯器CompDTD0變換文檔d,并接收d作為輸入,進入到可執行文檔d’,它的執行必須與抽象的過程m0Exec(d)等效。
圖19c顯示,規范語言M的解釋器IntMtoInt以m0的一個解釋過程作為開始。解釋器IntMtoInt以一個XML-機器人規范m0作為輸入,并啟動過程IntDTD0,而它又作為XML-文檔d的輸入。過程IntDTD0現在啟動一系列執行文檔d的過程,該過程必須與抽象的過程m0Exec(d)等效。
作為最后一種可能性,圖19d顯示了規范語言M的一種解釋器IntMtoComp。解釋器IntMtoComp以XML-機器人規范m0作為輸入,但與前述的解釋器IntMtoInt相比,它啟動一個編譯器過程CompDTD0,并以XML-文檔d作為輸入,產生一個可執行文檔d’作為輸出,d’的執行必須與抽象的過程m0Exec(d)等效。
可能很容易認識到,上述的每一種可能性都有其獨特的優點和缺點。大家知道,使用解釋器技術的優點是執行的即時有效性,更復雜的編譯器技術的優點是良好的運行和產生的可執行文檔的有效性,它可以單獨地重復使用,獨立于XML-機器人規范m0。
在圖20中,顯示了一種基于網絡XML-機器人的最佳實施例。服務器21,通常是一個高效網絡服務器,連接一個數據庫22和一個或更多個功能性程序庫23。通過網絡連接,尤其是因特網,一個或更多個客戶25.1、25.2,通常使用一個在遠程系統上運行的瀏覽器,可以訪問上述的服務器21。這些客戶25.1和25.2的接受力或多或少的受到限制,通常可能是運行諸如Java虛擬機器之類的有限抽象機器。
服務器21按照上述的XML-機器人規范,提供執行XML-文檔的服務。XML-機器人規范中的動作在服務器21上執行,例如,訪問服務器的數據庫22或者調用服務器的函數功能庫23。此外還有一些動作和可能附加的工具27,通過電子郵件、網頁、WAP、存儲管理服務和類似的形式來公布結果,來管理訪問權和管理潛在的數據庫和軟件系統的結構。XML-機器人規范可能只在服務器21上執行,但也可能用作服務文件提供給客戶。
這種情況可以和應用程序服務供應商(ASP)模型相比較,應用程序在服務器上運行,所有的客戶都能訪問他們。本發明分享了ASP的優點,所有的計算都是在服務器上完成。因此,客戶可以是非常小的裝置,如因特網工具。而且,本發明具有先進之處,即一個有限的XML-機器人規范可以執行無限多不同的XML-文檔,只要與相應的文件類型定義(DTD)相匹配。
執行服務供應商方法的應用程序范圍,包括從現存應用程序的輸入/控制,到新應用程序的規劃或設計。輸入/控制應用程序使用XML-文檔來控制一個應用程序。XML-機器人規范將簡單地把文檔翻譯成交互式的輸入/控制序列,用來控制應用程序。在新應用程序的規劃/設計中,XML-文檔符合程序的語法結構,而XML-機器人規范給出執行特征。下面給出一個例子,一個帶有DTD的XML-機器人規范,它表示了C語言程序的句法結構,而XML-機器人給出了它們的執行特征,這將允許發送任意的C語言程序到服務器并讓它們在服務器上執行。
與前面所描述的帶有執行服務供應商的裝置相比較,另一種首選裝置可以分別提供LangLets(小XML-機器人規范)和可移植語言。這里,服務器21為客戶25.1和25.2提供服務,它首先發送XML-機器人規范,然后按照規格執行XML-文檔。這種裝置要求客戶25.1和25.2來執行XML-文檔,這些客戶能夠從XML-機器人規范那兒生成解釋器/編譯器。因此XML-機器人規范的動作在客戶25.1和25.2上面執行。這種方法可以在較大意義上比喻為發送Java代碼到一個客戶,隨后它可以執行這段代碼。然而,與整個Java相比,XML-機器人規范所給出的執行特征非常簡單且遠不及Java那樣富有表達力。盡管如此,像Java這樣的語言可能用來設計XML-機器人規范的動作。在XML-機器人規范中,按照這樣一個XML-機器人規范來執行的所有XML-文檔(無限多的)執行特征,被限制在有限數目且固定的(但參數化的)Java-動作中。
本發明一個重要的優點是,可以調查一個限定的XML-機器人規范的安全特性。對那些打算在客戶25.1和25.2上執行的、無限多的不同XML文檔來說,這些特性可以分別被擔保或檢查。例如,如果某一關鍵性的安全動作沒有包含到XML-機器人規范的動作中去,那么對于那些按照這種XML-機器人規范執行的任何一個XML文檔來說,可以擔保(基于直接定義)不執行這個動作。或者,如果另一個關鍵性動作只有通過某一條件保護的狀態來觸發,那么它可以擔保只有完成了這個條件,才觸發這個動作。
再考慮一下可移植代碼可能有所幫助,在那兒源代碼發送到網絡上。然而,與它對比,這兒首先發送XML-機器人規范,它給出可移植語言/DTD的執行特征,然后傳遞程序/XML-文檔。因此,通過給定的網絡,提供一種可移植語言。借助可移植代碼的可移植語言的優點是,通過類的方式,在XML-機器人規范中嵌入了重復計算,而且,描述計算的實際例子的XML-文檔并不復雜。
這樣使用本發明的XML-機器人規范,允許定義一種新的語言,并執行上面所說語言中所寫的代碼,然后產生相應的編譯器和/或解釋器。進一步可能建立編輯器,調試器和分析工具。所描述的數據和代碼相互協作,直接允許我們定義有效XML-文檔的執行或其它過程,并不需要書寫一個單獨的程序來清楚地解析和分析該文檔的結構樹。
本發明提供一種裝置25.1和25.2,尤其是因特網裝置,這可以用于網絡環境中,尤其是因特網,它包含從遠程計算機接受和發送數據的方法。該裝置提供存儲和訪問數據(XML-文檔)的設備,這些數據發送到上述的遠程計算機。該裝置還包含檢驗從上述遠程計算機所接收到的數據的設備,如果合適,驗證這些數據是否有效和/或是否接受XML-機器人規范。該裝置進一步包含使XML-機器人規范和XML-文檔相結合的方法。然后通過該裝置執行XML-文檔,更可取地是通過一個處理部件來執行,它可以執行XML-文檔的指令。對該技術領域中的熟練人員來說,他們很容易理解,該工具所包含的方法歸結為這樣一種方式,即用于執行XML-文檔的處理部件可以為該裝置的發送/接受操作提供函數功能性。而且,該裝置通常包含一個用戶界面,如果愿意,它可以提供激勵執行和分析XML-文檔或XML-機器人規范的設備。然而,它只可以用作一個網絡內部的一個服務平臺。
本發明進一步提供一種裝置,它包含XML-機器人規范的圖象化顯示方法,例如,在一個高級的可視化完整發展環境中,參考圖3ff.描述的那樣。按照上述的規范,這種圖象化表示法用來生成描繪上述XML-機器人規范的XML-文檔。
本發明進一步允許提供XML-文檔的分布式執行。使用多路XML-機器人來分布XML-文檔的計算,應歸于這樣一個事實文檔的結構同時是處理它們的應用程序的結構。因此,XML-文檔的一部分可以輕易地在XML-機器人的不同情況下執行,這些XML-機器人可能放置在不同場所。同樣地,專用的應用程序可能要求文檔的一部分在服務器上執行,文檔的另一部分在客戶端執行。
權利要求
1.用于直接執行XML-文檔的方法,其特征在于通過對XML-文檔的每一個要素定義局部行為和過程,和使可執行的指令和文檔類型定義(DTD)、XML-文檔或其作為結構樹的表示法相結合,并通過動態創建和重新定義元素特征來存儲中間狀態。
2.根據權利要求1所述的方法,進一步包含如下步驟a)通過規定每一個XML-元素的定義和它的狀態來使可執行指令更完整,通過簡單的可執行動作組成的動作,以及這些動作要么引用為要素的組件之一定義的動作,要么引用為任何其它要素定義的動作;b)通過執行為它的根段定義的動作來執行XML-文檔。
3.按照前面的聲明之一所采用的方法,其特征在于通過表示時序或并行控制和/或數據流的圖象化流程圖,至少為一個XML-要素的定義或狀態規定動作的組成。
4.按照前面的權利要求之一所述的方法,其特征在于以表示時序或并行控制和/或數據流的文本形式,至少為一個XML-要素的定義或狀態規定動作的組成。
5.根據前面的權利要求之一所述的方法,其特征在于以n維數據塊的形式來表示系統狀態,具有一個開放的面向系統的界面,它使n維數據塊可讀寫其它程序和/或數據庫系統,且可從上述的系統中訪問其它程序和數據庫系統的數據結構和功能性函數。
6.按照前面的權利要求之一所述的方法,其特征在于為每一要素定義過程的模塊,這些模塊關于下面的DTD有效<![CDATA[<!element module(derived*,expression?,state*,module*><!attlist module name CDATA#REQUIRED number CDATA”1”><!element derived(argument*,expression)><!attlist derived name CDATA><!element argument EMPTY><!attlist argument name CDATA><!element state(action*,transition*)><!attlist state name CDATA><!element transition(expression,path)><!element path(component?)><!attlist path state CDATA“initial”><!element component(component?)><!attlist component name CDATA#REQUIRED number CDATA”1”><!element expression(path|self|src|trg|evalattr|getfirst| getnext|parent|root|apply|external|constant><!element action(setattr|ifthen|forall|external)><!element src EMPTY><!element trg EMPTY><!element self EMPTY><!element evalattr(expression?)><!attlist evalattr attribute CDATA#REQUIRED><!element getfirst(expression?)><!attlist getfirst attribute CDATA#REQUIRED><!element getnext(expression?)><!element parent(expression?)><!element root EMPTY><!element apply(expression,expression?)><!attlist apply op CDATA#REQUIRED><!element external(expression*)><!attlist external name CDATA language CDATA><!element constant EMPTY><!attlist constant value CDATA#REQUIRED><!element setAttr(expression?,expression)><!attlist setAttr attribute CDATA#REQUIRED><!element ifthenelse(expression,action*)><!element forall(action*)><!attlist forall range CDATA“all-elements” variable CDATA>]]>
7.一種使用前面權利要求之一所述的方法的系統,其特征在于服務器按照從客戶發送到服務器的XML-機器人規范,至少執行XML-文檔的一部分為至少一個客戶提供服務;或者,服務器通過發送一個XML-機器人規范和一個XML-文檔給客戶,為至少一個客戶提供服務,使得通過至少執行客戶端所發送文檔的一部分來提供上述服務,該文檔符合所發送的XML-機器人規范。
8.一種使用前面權利要求1~5之一所述的方法的裝置,包含用于往遠程計算機發送和接收數據的設備;存取和訪問XML-文檔的設備;使XML-機器人規范和XML-文檔相結合的設備,以及執行這些完整的文檔的設備。
9.一種使用前面權利要求1~7之一所述的方法的裝置,包含在一個高級可視化完整發展環境中,用于XML-機器人規范的圖象化顯示的設備,以及生成表示上述XML-機器人規范的XML-文檔的設備。
10.一種根據權利要求8或9所述的裝置,進一步包含檢驗、驗證或激勵XML-文檔或XML-機器人規范的設備。
全文摘要
本發明涉及一種直接執行XML-文檔的方法,系統和工具,是通過分別使用文本化或圖像化流程圖,將XML-文檔、文件類型定義(DTD)或他們的代表修飾成結構樹。XML-文檔的數據結構被重新用于處理其代碼并與其合并。
文檔編號G06F9/45GK1454357SQ00819741
公開日2003年11月5日 申請日期2000年8月2日 優先權日2000年8月2日
發明者菲利普·庫特 申請人:菲利普·庫特