CN101416182B - 表达式分组和求值 - Google Patents
表达式分组和求值 Download PDFInfo
- Publication number
- CN101416182B CN101416182B CN2004800345552A CN200480034555A CN101416182B CN 101416182 B CN101416182 B CN 101416182B CN 2004800345552 A CN2004800345552 A CN 2004800345552A CN 200480034555 A CN200480034555 A CN 200480034555A CN 101416182 B CN101416182 B CN 101416182B
- Authority
- CN
- China
- Prior art keywords
- node
- expression formula
- expression
- document
- processor
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
- Document Processing Apparatus (AREA)
Abstract
一种设备包括样式表编译器和文档处理器。样式表编译器被配置为标识样式表中的表达式,并被配置为生成表示表达式的一个或多个表达式树。具有一个或多个共同节点的表达式被表示为代表共同的节点的子树的子。连接为接收文档和表达式树的文档处理器被配置为对照文档对一个或多个表达式树中表示的表达式进行求值。
Description
技术领域
本发明涉及处理和转换诸如可扩展标记语言(XML)、标准化通用标记语言(SGML)、超文本标记语言(HTML)之类的结构化文档,以及数据库和/或文件系统中的非结构化数据和文档的领域。
背景技术
随着计算机和计算机存储器变得无所不在,各种组织维护的信息量显著地增大。信息常常以许多不同的格式存储,如字处理器文档、电子表格文件、数据库、可移植文档格式(PDF)文档、图像化文档(例如,扫描为各种图形显示格式)、纯文本等等。此外,文档可以以诸如SGML、HTML、XML等等之类的标记语言格式进行存储。
使信息具有如此多的不同格式使得在组织内以及在组织外部共享信息复杂化。近来,XML已经作为用于描述文档中的内容并向非结构化数据和/或文档提供结构的标准。XML提供了灵活而可扩展的机制,用于为文档定义标记,允许为所描述的信息自定义标记。
作为处理XML的装置实现的一种机制是可扩展的样式表语言(XSL)和使用XSL编写的样式表。可以编写样式表,以将XML文档从在XML内定义的一种标记定义(或“词汇表”)转换为另一种词汇表,从XML标记转换为另一种结构化或非结构化文档格式(如纯文本、字处理器、电子表格、数据库、PDF、HTML等等),或从另一种结构化或非结构化文档格式转换为XML标记。如此,样式表可以用来通过将文档的结构从其存储的格式转换为给定用户预期的格式来简化对组织的信息的访问(以其许多不同的格式)。还有其他样式表类型(例如,作为对HTML的扩展定义的级联样式表或CSS)。
通常,以在通用计算机(例如,对文档存储进行管理的服务器,用户计算机等等)上执行的软件执行文档转换处理。在访问这样的文档时会遇到严重的延迟。
发明内容
在一个实施例中,设备包括样式表编译器和文档处理器。样式表编译器被配置为标识样式表中的表达式,并被配置为生成表示表达式的一个或多个表达式树。具有一个或多个共同节点的表达式被表示为代表共同节点的子树的子。连接为接收文档和表达式树的文档处理器被配置为对照文档对一个或多个表达式树中表示的表达式进行求值。
附图说明
下面的详细描述参考了简要描述的附图。
图1是内容转换设备的一个实施例的方框图。
图2是图1所示的文档处理器的一个实施例的方框图。
图3是图2所示的文档处理器和图1所示的处理器的一部分的一个实施例的方框图,说明了它们之间的通信和对它们的输入。
图4是说明了样式表编译和表达式求值的方法的一个实施例的流程图。
图5是说明了样式表编译器的一个实施例的操作的流程图。
图6是说明了架构编译器的一个实施例的操作的流程图。
图7是说明了图2和3所示的分析器的一个实施例的输入数据结构和输出数据结构的一个实施例的方框图。
图8是说明了图7所示的用于向节点标识符分配序列号的分析器的一个实施例的操作的流程图。
图9是说明了图2和3所示的表达式处理器的一个实施例的输入数据结构和输出数据结构的一个实施例的方框图。
图10是图2和9所显示的分析时表达式树的一个实施例的方框图。
图11是表达式树的一部分和对应于此的分析时表达式树条目的示例。
图12A-12B是说明了响应元素开始事件的表达式处理器的一个实施例的操作的流程图。
图13是说明了响应元素结束事件的表达式处理器的一个实施例的操作的流程图。
图14A-14B是说明了响应属性名称事件的表达式处理器的一个实施例的操作的流程图。
图15是说明了响应元素关闭事件的表达式处理器的一个实施例的操作的流程图。
图16是说明了转换引擎的一个实施例的操作的流程图。
图17是图2和9所显示的分析时表达式树的另一个实施例的方框图。
图18是说明图17所示的某些字段的示范性编码的一组表。
图19A-19B是说明了响应元素开始事件的表达式处理器的一个实施例的操作的流程图。
图20是说明了响应元素结束事件的表达式处理器的一个实施例的操作的流程图。
图21A-21B是说明了响应属性名称事件的表达式处理器的一个实施例的操作的流程图。
图22A-22B是说明了响应文本事件的表达式处理器的一个实施例的操作的流程图。
图23A-23B是说明了响应注释事件的表达式处理器的一个实施例的操作的流程图。
图24A-24B是说明了响应处理指令事件的表达式处理器的一个实施例的操作的流程图。
尽管本发明可进行各种修改,并且还可采用其他的形式,但是,本发明的各具体实施例均以结合附图的举例的方式说明,并将在以下的说明书中进行详细描述。然而,应该理解,图形和详细描述不将本发明限制于所说明的特定形式,相反,本发明涵盖不偏离所附的权利要求所定义的本发明的精神和范围的所有修改方案、等效内容和替代方案。
具体实施方式
现在请参看图1,该图显示了内容转换设备10的一个实施例的方框图。在图1的实施例中,内容转换设备10可以包括网络接口电路12,诸如处理器14A和14B(可选)之类的一个或多个处理器,文档处理器16以及存储器18。网络接口电路12通过一个或多个网络连接而连接到一个或多个网络。各种计算机系统(图1中未显示)也可以连接到一个或多个网络。网络接口电路12也连接到处理器14A-14B。处理器连接到存储器18和文档处理器16,而文档处理器16还连接到存储器18。在所说明的实施例中,存储器18存储了样式表编译器20、架构编译器22、一个或多个符号表24、一个或多个分析时表达式树26、指令表30、空格表32、文档类型定义(DTD)表34、表达式列表36、模板列表38,以及各种文档处理器数据结构39。
内容转换设备10可以通过网络连接接收待应用于文档的样式表、待应用于文档的架构,和/或文档本身(带有将样式表/架构应用到文档的请求)。响应应用样式表的请求,内容转换设备10可以将样式表应用到文档,并生成待通过网络传输到请求者的转换的文档。在一些实施例中,内容转换设备10还可以接收对文档进行分析的请求(例如,分析为诸如针对XML的简单应用程序编程接口(API)(SAX)或文档对象模型(DOM)之类的已定义的格式)。响应应用架构(或DTD)的请求,内容转换设备10可以根据架构或DTD对文档进行验证,并对请求者生成成功消息或失败消息(指出失败)。
在一些实施例中,内容转换设备10可以接收用于对XML数据库进行访问的XPath表达式。在这样的实施例中,可以类似于样式表对表达式进行编译(下面将比较详细地描述),并可以以类似于将样式表应用于文档的方式应用于XML数据库。
一般而言,XML文档具有分层树形结构,其中,树的根将文档标识为一个整体,文档中的每个其它节点是根的后代。各种元素、属性以及文档内容构成了树的节点。元素定义了元素所包含的内容的结构。每一个元素都具有元素名称,元素使用开始标记和结束标记(两者都包括了元素名称)将内容分隔开。一个元素还可以具有其他元素作为子元素,子元素可以进一步定义内容的结构。此外,元素还可以包括属性(包括在开始标记中,跟在元素名称后),它们是提供关于元素或元素内容的结构的详细信息的名称/值对。XML文档还可以包括将被传递到应用程序的读取XML文档、注释等的处理指令。如这里所使用的,术语“文档”是指具有可用于对内容进行解释的对应的已定义的结构的任何内容。内容可以被高度结构化(如XML文档、HTML文档、pdf文档、字处理文档、数据库等等),也可以如纯文本文档(其结构可以是字符流)那样简单。一般而言,文档的“节点”可以包括结构性定义(例如,XML中的元素和/或属性)和/或文档内容。在一个特定实施例中,节点可以包括元素、属性、处理指令、注释和文本。
XSLT样式表可以被视为一组模板。每一个模板都可以包括:(i)选择源文档的树形结构中的节点的表达式;以及(ii)为源文档的每一个匹配节点指定待实例化的输出文档的结构的对应的部分的正文。将样式表应用到源文档的操作可以包括试图查找源文档中的每一个节点的匹配模板,实例化输出文档的树中的匹配模板的正文。模板的正文可以包括以下内容的一个或多个:(i)输出文档中的待实例化的文本内容;(ii)从匹配节点中选择待复制到输出文档中的内容;以及(iii)待求值的语句,在输出文档中语句被实例化的结果。概括起来,待实例化的内容和待求值的语句可以被称为要在与模板匹配的节点上执行的“操作”。模板的正文可以包括一个或多个“apply templates”语句,其中,包括选择一个或多个节点并使样式表中的模板应用于所选择的节点的表达式,如此有效地将模板嵌套起来。如果查找到与应用模板语句的匹配,则所产生的模板在包括应用模板语句的模板的实例化内被实例化。模板的正文中的其他语句还可以包括待与节点进行匹配的表达式(并可以在匹配节点中对语句进行求值)。尽管这里在一个示例中可以使用XSLT样式表,但是,一般而言,“样式表”可以包括用于将源文档转换为输出文档的任何规范。源文档和输出文档可以采用相同语言(例如,源文档和输出文档可以是不同的XML词汇表),也可以采用不同语言(例如,XML到PDF等等)。样式表的另一个示例可以是为HTML和/或XML Query定义的级联样式表。
一般而言,在样式表中所使用的表达式可以包括节点标识符和/或节点的值,以及节点标识符上的指定节点标识符和/或值之间的父/子(或祖先/后代)关系的操作符。节点标识符可以包括名称(例如,元素名称、属性名称等等),也可以包括按类型标识节点的表达式构造,(例如,节点测试表达式可以与任何节点匹配,或者,文本测试表达式可以与任何文本节点匹配)。在某些情况下,名称可以属于具体的命名空间。在这样的情况下,节点标识符可以是与命名空间关联的名称。在XML中,命名空间提供了通过将元素和属性名称与由通用资源标识符(URI)所标识的命名空间名称关联来限定元素和属性名称的方法。如此,节点标识符可以是限定名(可选的命名空间前缀,后面是冒号,再后面是名称)。如这里所使用的名称(例如,元素名称,属性名称等等)可以包括限定名。表达式还可以包括谓词,该谓词可以是用于与节点进行匹配的额外的条件。谓词是用关联的节点作为上下文节点(下面定义)进行求值的表达式,其中,表达式的结果为true(节点可以与表达式节点匹配)或者false(节点不与表达式匹配)。如此,表达式可以被视为待与文档的树进行匹配的节点的树。在XPath中,在XSLT中所使用的表达式语言可以在“contextnode”的上下文中对表达式进行求值(即,表达式可以相对于上下文节点,指定表达式中的节点标识符作为上下文节点的祖先、后代、父母或子女以及与其他节点标识符的关系)。如果通过对表达式的求值选择给定文档节点,则该给定文档节点可以满足表达式。即,表达式中的表达式节点标识符匹配了给定文档节点的名称或与表达式中所指定的给定文档节点具有相同关系的文档节点名称,在表达式中所使用的任何值都等于与给定文档节点相关的对应值。如果一个文档节点满足给定表达式,则该文档节点也可以被称为给定表达式的“匹配节点”。在某些情况下,在本讨论的其余部分,区别表达式树中的节点与文档中的节点是有帮助的。如此,如果一个节点是表达式树的一部分,则该节点可以被称为“表达式节点”,如果一个节点是正在处理的文档的一部分,则该节点可以被称为“文档节点”。
在所说明的实施例中,可以以如下方式执行将样式表应用到文档的操作。样式表编译器20可以包括在处理器14A-14B中的某一个处理器上执行的软件(即,多个指令),以将样式表编译为供文档处理器16使用的一个或多个数据结构和代码。文档处理器16可以将数据结构应用于源文档并生成输出文档。
具体来说,在一个实施例中,样式表编译器20可以向节点标识符分配序列号,以便可以由文档处理器通过比较数字,而不是节点标识符(将涉及字符串比较)来执行表达式求值。样式表编译器20可以将节点标识符与序列号的映射存储在符号表24中。此外,样式表编译器20还可以从样式表中提取表达式,并生成表达式树数据结构,供文档处理器用于进行表达式匹配(例如,分析时表达式树26)。更进一步,样式表编译器20还可以用为每一个匹配表达式执行的指令生成指令表30(在一个实施例中,也可以是待执行以对运行时谓词进行求值的指令)。指令表中的指令,当由文档处理器16执行时,可以导致执行被定义为当匹配表达式时执行的操作。在一些实施例中,指令可以包括待执行的操作(即,在指令和操作之间可以有一对一的对应关系)。在其他实施例中,至少一些操作可以通过执行两个或更多指令来实现。样式表编译器20还可以生成定义如何处理(例如,保留、剥离等等)源文档中的各种空格的空格表32,表达式列表36和模板列表38。
架构编译器22可以类似地包括在处理器14A-14B中的某一个处理器中执行的指令。架构编译器22可以编译架构或DTD以生成一个或多个符号表24(用序列号代替节点标识符)以及DTD表34。一般而言,DTD或架构可以包括允许的文档结构和必需的文档结构两种结构的定义。如此,文档的作者可以用DTD和/或架构来描述有效文档的必需的和允许的结构。在某些情况下,DTD或架构还可以包括属性的默认值。在一个实施例中,DTD/架构可以包括各种信息:用于代替文档中的实体引用的实体声明,给定元素的对于有效文档是必需的属性的属性,可以不必在文档的给定元素中指定的属性的属性默认值,文档的结构的要求(例如,某一子元素的必需的最小/最大/具体数量等等),以及文档的允许的结构的定义。DTD表34可以包括实体引用替换的表,必需的属性的表,属性默认值的表,以及标识允许的结构(如果适用的话,还有必需的结构)的骨架树。
文档处理器16可以包括用于对文档进行分析并将文档节点与分析时表达式树中的表达式节点进行匹配的硬件电路。即,用于对文档进行分析并将文档与表达式节点进行匹配的硬件电路,可以执行这些操作而不执行任何软件指令。对于每一个表达式,硬件可以生成存储了匹配文档节点的分析的内容和指示的各种数据结构。然后,对于该给定表达式的每一个匹配文档节点上的给定表达式,硬件可以执行来自指令表30的指令,生成结果,然后,将这些结果组合起来,以产生输出文档。下面提供了一个实施例的其他细节。
如上所述,在所说明的实施例中,以软件实现样式表编译器20和架构编译器22,以硬件实现文档处理器16。在一些实施例中,当发出转换请求并提供文档时,内容转换设备10的性能中的关键因素可以是对文档的处理。即,在很多情况下,与正在处理的文档数量相比,样式表和/或架构可以相对不太频繁地改变。在改变样式表(改变为更新的样式表或不同的样式表)之前,一个给定样式表可以应用于多个文档(例如,至少大约数十个文档)。对于架构和将向其应用架构的文档,类似的关系也成立。相应地,从样式表/架构(使用软件)将相对不变的信息捕获到可以有效地通过专用的自定义硬件访问的数据结构中,可以提供高性能的解决方案。此外,在一些实施例中,以硬件进行样式表/架构编译,可以提供实现不同的样式表/架构语言和/或实现语言规范改变的灵活性,而不需要改变自定义硬件。例如,XSLT、XPath和XML架构仍在发展,将来会向这些语言中添加新的功能。可以使编译器处理这些新的功能。可以预先提供要使用的样式表/架构,如此,编译样式表/架构的时间可以不那么要求严格了。然而,在其他实施例中,样式表编译器20和架构编译器22中的某一种或两者都可以以硬件来实现,也可以以硬件和软件的组合来实现。
网络接口电路12可以处理网络连接上的低级别的电子方面的和协议方面的细节内容,并可以将接收到的数据包传递到处理器14A-14B进行处理。可以使用任何网络类型。例如,在一些实施例中,网络连接可以是千兆以太网连接。可以依照要求提供一个以上的连接,以达到给定的带宽级别和/或在网络连接中提供冗余。
处理器14A-14B可以包括任何处理器类型。例如,在一个实施例中,处理器14A-14B可以是PowerPC网络处理器。在其他实施例中,处理器14A-14B可以实现其他指令集体系结构,如ARM、英特尔的IA-32,MIPS等等。
可以使用任何互连来将处理器14A-14B、文档处理器16以及存储器18连接起来。除了处理器14A-14B和文档处理器16两者与存储器18建立的连接之外,处理器14A-14B还可以连接到文档处理器16。例如,在一个实施例中,处理器14A-14B可以使用一个或多个外围组件互连快速(PCI-X)总线连接到文档处理器16。
值得注意的是,在某些情况下,DTD、架构或样式表可以嵌入在文档中(要么直接要么作为指向架构或样式表的指针)。在这样的情况下,可以从文档提取DTD、架构或样式表,并按为单独提供的架构或样式表描述的方式进行处理。
存储器18可以包括任何易失性或非易失性存储器类型。例如,存储器18可以包括一个或多个RAM(例如,SDRAM、RDRAM、SRAM等等),诸如闪速存储器或电池供电的RAM之类的非易失性存储器,诸如磁盘或CD-ROM之类的磁性或光存储器等等。存储器18可以包括可单独地访问的多个存储器(例如,只能让处理器14A-14B访问的一个分区或多个分区,以及只能让文档处理器16访问的另一个分区或多个分区)。
图1说明了存储在存储器18中的样式表编译器20和架构编译器22。一般而言,样式表编译器20和/或架构编译器22可以在任何计算机可访问的介质上编码。一般而言,计算机可访问的介质可以包括可供计算机访问的任何介质,用来向计算机提供指令和/或数据。例如,计算机可访问的介质可以包括诸如磁性或光学介质之类的存储介质,例如,磁盘(固定或可移动)、CD-ROM或DVD-ROM,易失性或非易失性存储器介质,如RAM(例如,SDRAM、RDRAM、SRAM等等),ROM、闪速存储器等等,以及通过传输介质可访问的介质,或通过诸如网络和/或无线链路之类的通信介质传输的诸如电的、电磁的信号或数字信号。
在一些实施例中,计算机可访问的介质可以包括在单独的计算机系统中,这种计算机系统可以执行样式表编译器20和/或架构编译器22以执行编译。由编译而产生的数据结构/代码可以传递到内容转换设备10(例如,通过网络连接传递到内容转换设备10)。
值得注意的是,尽管这里的描述可以包括其中样式表应用于文档的示例,但是,其他示例也可以包括将多个样式表应用到文档(依照要求,并行地或串行地),以及将样式表应用到多个文档(依照要求,并行地,具有上下文切换或者串行地)的情况。
下面请参考图2,显示了文档处理器16的一个实施例的方框图。在图2的实施例中,文档处理器16包括分析器电路40、表达式处理器42、转换引擎44、输出生成器46,以及验证器电路48。分析器电路40连接到表达式处理器42和输出生成器46。表达式处理器42连接到转换引擎44,而转换引擎44连接到输出生成器46。验证器48连接到输出生成器46。图2中的单元可以彼此直接连接(例如,使用单元之间的信号线),也可以通过存储器18进行连接(例如,源单元可以将待传递到目标单元的信息写入到存储器18中,目标单元可以从存储器18中读取信息)或采用两种方式连接。
分析器电路40可以接收文档,并对文档进行分析,为表达式处理器42和验证器电路48标识事件,也可以用被分析的内容生成数据结构。如果文档处理器16根据样式表转换文档,则被分析的内容可以存储在存储器18中的数据结构中,供转换引擎44使用。或者,如果文档将只被分析,则分析器电路40可以给输出生成器46提供被分析的内容,以便以SAX或DOM格式输出。分析器电路40也可以通过存储器18给输出生成器46提供被分析的内容。
表达式处理器42从分析器电路40接收事件(标识从文档分析的文档节点),并将由分析器电路40标识的文档节点对照分析时表达式树进行比较。表达式处理器42将每一个表达式的匹配文档节点的列表输出到转换引擎44。转换引擎44接收由分析器电路40生成的被分析的内容的数据结构和匹配文档节点的列表,并执行来自指令表30的对应的指令,以为输出文档生成结果。在一些实施例中,每一个指令都可以独立于其他指令,如此,可以以任何顺序执行。输出生成器46可以按顺序将结果重新组合起来,并可以将输出文档写入到存储器18中(也可以将输出文档发送到处理器14A-14B,而不经过存储器18)。处理器14A-14B可以执行软件,以读取输出文档,并将输出文档传输到请求者。
验证器电路48还可以接收由分析器电路40发送的事件,并可以应用架构/DTD(如骨架树和DTD表34所表示的),并可以判断文档是否有效,如架构中所指出的。如果文档有效,则验证器电路48可以生成成功消息,以传输到输出生成器46。如果文档无效,则验证器电路48可以生成失败消息(并指出失败的理由),并可以将失败消息传输到输出生成器46。输出生成器46可以将消息存储到存储器18中(并且处理器14A-14B可以随后将消息传输到请求者)。
现在请看图3,该图显示了文档处理器16(具体来说,分析器电路40、表达式处理器42,以及转换引擎44)和处理器14A的一部分。图3比较详细地突出显示了根据内容转换设备10的一个实施例在所说明的部分之间的通信。处理器14B还可以以为处理器14A描述的方式来进行操作。
处理器14A可以从内容转换设备10所连接的网络接收数据包。数据包的数据有效负载可以包括待由内容转换设备10转换的文档。此外,其他接收到的数据包可以包括其他通信(例如,样式表或架构,或与内容转换设备10的其他通信)。处理器14A可以将文档重新组合起来,并将重新组合的文档传递到分析器电路40。
分析器电路40从处理器14A接收重新组合的文档,还可从存储器18中对符号表24、DTD表34,以及空格表32进行访问。分析器电路40对文档进行分析,并生成与检测到的文档节点相关的事件。具体来说,分析器电路40将文档中的节点标识符转换为符号表24中的对应的序列号,并作为事件的一部分将序列号传输到表达式处理器42。此外,分析器电路40为转换引擎44生成被分析的内容表,该表存储了文档的被分析的内容。表达式处理器42从分析器40接收事件,并将标识的文档节点(基于它们的序列号)针对分析时表达式树26进行比较。匹配文档节点被标识并记录在模板和表达式匹配列表中,以便发送到转换引擎44中。
转换引擎44接收模板和表达式匹配列表以及被分析的内容表,还接收指令表30。转换引擎44对任何运行时表达式进行求值,并从模板和表达式匹配列表中消除不满足运行时表达式的文档节点。此外,转换引擎44在匹配该表达式的每一个文档节点上为每一个表达式执行来自指令表30的指令,并将结果输出到输出生成器46。
在所说明的实施例中,处理器14A可以内联地传输重新组合的文档,分析器电路可以内联地将事件传输到表达式处理器42。即,随着处理器14A接收和重新组合文档的某些部分,处理器14A将文档的一部分传递到分析器电路40。如此,在处理器14A接收到整个文档之前,分析器电路40可以开始进行分析。类似地,在标识事件时,事件被传递到表达式处理器42。另一方面,被分析的内容表和模板/表达式匹配列表被通过存储器18传递(由到转换引擎44的通信上方的虚线椭圆表示)。如这里所使用的,如果数据是直接传递的,而不缓存在诸如存储器18之类的存储器中(虽然源或接收器可以将数据临时排成队列,以供传输),则数据从源“内联地”传输到接收器。内联地传输的数据遇到的延迟比通过存储器进行传输所遇到的延迟小。
现在请看图4,该图显示了说明用于转换文档的方法的一个实施例的流程图。一般,该方法可以应用于文档转换包括多个阶段的场合。样式表中的表达式可以根据可以对表达式进行求值的最早的阶段进行分类。然后,在每一个阶段,对可以在该阶段进行求值的表达式进行求值。如此,可以在尽可能最早的阶段对每一个表达式进行求值,使得留在稍后的阶段求值的表达式变得较少。
在所说明的实施例中,阶段可以包括编译阶段、分析阶段,以及转换阶段。在编译阶段,样式表中的表达式被特征化(例如,在此实施例中,被特征化为编译时、分析时或者运行时)(方框50)。此外,在编译阶段,对编译时表达式进行求值(方框52)。在分析阶段,对分析时表达式进行求值(方框54)。在转换阶段,对运行时表达式进行求值(方框56)。
在一些实施例中,运行时表达式可以被分成可以较早地求值的部分(例如,分析时)和运行时部分。可以根据运行时部分对可较早地求值的部分进行求值和加以组合。即,匹配表达式的分析时部分的文档节点和具有用于表达式的运行时部分的相同值的文档节点被分组在一起。在运行时,对表达式的运行时部分进行求值,如果对应于一个组的值不满足表达式的运行时部分,则淘汰该组。只有满足表达式的运行时部分的组才被保留,在保留的组中的文档节点上执行指令。
在实现了XSLT样式表的一个实施例中,如果一个表达式不包括祖先/后代引用(//)并且不包括谓词,则该表达式可以是编译时。如果一个表达式不包括引用了当前节点、后面的同辈节点或元素值,则该表达式可以是分析时。不是编译时或分析时的表达式是运行时表达式(例如,引用了当前节点或包含引用了后面的同辈或元素值的谓词的表达式)。对于不引用当前节点的运行时表达式,可以在分析时对不包括上文所提及的谓词的部分进行求值。关于这一点,如果表达式是模板匹配表达式,则当前节点可以是上下文节点,也可以是在模板正文内的语句中被引用的节点(例如模板正文内的循环构造或者其他表达式)。
哪些表达式是分析时或运行时,部分地受到表达式处理器42的内联本质的影响。即,文档节点被内联地标识和传递到表达式处理器42。相比之下,如果表达式处理不是内联的,则当处理特定节点时,可能定位过去的和未来的文档节点。如此,如果表达式处理不是内联的,则只有引用了当前节点的表达式可能不会被处理。对于内联处理,针对表达式树的匹配文档节点一般可以包括保留有关表达式树中的哪些表达式节点与前面的文档节点匹配的信息。然后,如果前面的文档节点的子或后代由分析器电路40标识,则这样的子/后代文档节点可以与表达式树中的链接到表达式树中的以前匹配的表达式节点的后续的级别相比。
对编译时表达式进行求值可以应用于“apply templates select”语句中的表达式。如上所述,“apply templates”语句选择模板正文的上下文中的一组节点,并将模板应用到节点。“apply templates select”语句包括选择一组节点的表达式。然后,将该组节点应用于样式表中的模板。如果“apply templates select”语句中的表达式符合上文给出的编译时定义,那么,编译器可以判断该组中的节点可以匹配哪些模板(如果有的话)。如此,在这样的情况下,可以免除模板匹配。在一个实施例中,编译器可以执行apply templates select语句中的表达式和包括模板匹配条件的表达式之间的代数匹配。对分析时和运行时表达式进行求值可以包括判断哪些节点满足表达式。
在一个实施例中,由XML架构所描述的XML文档的上下文中的XPath表达式的代数匹配可以按如下方式执行。下面的定义在描述XPath表达式和XML架构的代数匹配算法时是有用的。如果P是XPath表达式而S是XML架构,当且仅当在S中声明了在P中出现的每一个元素和属性名称并且在S中具有相同类型(元素或属性)时,才可以为S定义P。如果P和Q是两个XPath表达式,则当且仅当基于S的任何输入文档D中的满足P的每一个节点也都满足Q时,对于S,P才可以被称为匹配Q。“简单”表达式可以是排除了″//″运算符和″.″运算符的表达式。给定了这些定义,对于表达式P和一组一个或多个简单表达式E,可以按如下方式执行一个实施例中的代数匹配。首先,可以规范化表达式。以″/″开始的表达式是规范化格式。如果表达式Q不以″/″开始,则按如下方式对其进行规范化:(i)如果Q在任何循环的范围之内,则对于每一个循环,用选择表达式将Q预先挂起(通过/运算符将每一个选择表达式和Q分开),最内层循环选择表达式是最近的Q,并作为预先挂起的表达式的开始,进入最外面的循环选择表达式;(ii)用其中出现了Q的模板的模板匹配条件将由(i)形成的表达式预先挂起;并且(iii)如果模板匹配条件不是″/″,用″//″将由(i)和(ii)形成的表达式预先挂起。如果是简单表达式E(按上文所述的方式,已规范化),可以形成类似于分析时表达式树26的表达式树,只是忽略了谓词。如此,相同的表达式(具有可能的谓词的例外)可以被映射到表达式树中的相同路径,并与表达式树中的相同叶节点关联。将P与表达式树进行匹配(即,如果P中的每一个节点标识符或运算符在同一个位置匹配表达式树,则存在匹配)。如果在P穷尽的同时到达了表达式树中的叶节点,与该叶节点关联的表达式是E中的匹配P的表达式。这些匹配表达式可以是编译时表达式,可以将这些表达式消除。
现在请看图5,该图是显示了样式表编译器20的一个实施例的流程图。在其中样式表编译器20是以软件实现的实施例中,样式表编译器20包括指令,当执行这些指令时,实现了图5所示的功能。值得注意的是,尽管图5中的方框显示了样式表编译器20的功能,但是,该流程图并不意味着,编译器按照所列出的顺序来执行功能,也不意味着,在开始下一功能之前,样式表上的一个功能必须整个地都完成。
样式表编译器20标识样式表中的表达式(方框60),并将表达式分类为编译时、分析时或运行时。表达式可以在样式表中的模板匹配语句中,在应用模板语句中,以及在各种其他语句中。样式表编译器20生成每一个表达式的规范格式(方框62)。一般而言,可以有许多不同的方式来表示给定表达式,即使不同的方式在逻辑上是等效的。规范格式指定了表示给定表达式的特定方式,以简化标识等效表达式(或表达式的等效的某些部分)的过程。样式表编译器20向表达式中的节点标识符分配序列号(方框64)。
样式表编译器20可以对表达式执行共同的前缀压缩,以构建分析时表达式树(方框66)。如上所述,表达式一般可以包括将与文档中的节点标识符进行匹配的节点标识符的分层列表。如此,各种表达式可以具有共同的部分(具体来说,在层次结构中较高的表达式节点即与根靠近的表达式节点,对于各种表达式可以是相同的)。如此,共同的部分可以位于表达式的第一部分(表达式的“前缀”)。通过将这样的表达式一起压缩在分析时表达式树中,可以以分析时表达式树一次性表示共同部分,一旦表达式开始不同,则表达式的其余部分变为共同部分的子部分。相应地,在分析时表达式树的共同部分中,可以并行地对可以匹配文档节点的多个表达式进行求值,并且当存在差别时,可以在树中分叉。分析时表达式树可以更加紧凑,并且在这样的情况下,可以更快地对它们进行处理。
例如,两个表达式(在分配序列号之后)可以是/10/15/20/25和/10/15/20/30/35。这两个表达式共同地具有/10/15/20/。相应地,这两个表达式可以作为包括节点10的共同部分以分析时表达式树来表达,节点10以节点15作为子节点,而节点15以节点20作为子节点。节点20可以具有两个子节点(25和30)。节点30可以以节点35作为子节点。随着文档节点被分析并传递到表达式处理器42,可以并行地对照文档节点对表达式进行求值,直到到达节点20。然后,可以将下一子文档节点与表达式节点25或30中的零个或一个进行匹配。
如前所述,样式表编译器20可以将运行时表达式划分为可以在分析时对其进行求值的部分和在运行时对其进行求值的部分。分析时部分可以包括在分析时表达式树中。在分析时表达式树中的存在运行时谓词的每一个级别,样式表编译器20可能会注意到,匹配节点将被分组(并且可以保留运行时谓词所使用的信息),以便可以在运行时对谓词进行求值,取决于匹配文档节点是否满足运行时谓词,要么保留要么丢弃匹配文档节点。在表达式中的各个级别中,给定运行时表达式可以包括一个以上的运行时谓词,如此,可以进行多个级别的分组。在每一个分组级别,具有对应于运行时谓词的相同值的文档节点被分组在一起。当对运行时谓词进行求值时,如果值不匹配运行时谓词,则丢弃该组文档节点(以及该组的任何子组)。那些值匹配被求值的运行时谓词的组,将被保留,并由转换引擎44进行处理。
样式表编译器20可以向存储器18输出多个由分析器电路40和/或表达式处理器42使用的数据结构(方框68)。可以输出分析时表达式树,以及将节点标识符映射到序列号的一个或多个符号表24。例如,在一个实施例中,可以为元素名称和属性名称输出单独的符号表。在其他实施例中,可以输出单一的符号表。此外,样式表编译器20还可以为每一个模板输出具有一组指令的指令表30,转换引擎44可以执行这些指令来执行模板正文。样式表20可以进一步为每一个运行时谓词输出指令,当在转换引擎中执行指令时,将对运行时谓词进行求值。更进一步,样式表编译器20还可以输出如下所述的模板列表38和表达式列表36。
在一些实施例中,给定样式表可以包括一个或多个其他样式表和/或导入一个或多个其他样式表。就像被包括的样式表在物理上被移到样式表包体中(例如,类似于C语言中的#include语句的处理)那样,对待被包括的样式表。即,被包括的样式表的正文可以基本上代替样式表包体中的include语句。如果在被包括的样式表和样式表包体之间存在冲突(例如全局变量声明),则使用样式表包体中的定义。在XSLT样式表中,可以在样式表包体中的xsl:include元素中阐述被包括的样式表。另一方面,将被导入的样式表当做单独的样式表,该样式表可以被样式表包体中的语句显式地引用。可以在模板匹配语句中进行显式引用(在这种情况下,使用来自被导入的样式表中的模板)。如果显式引用是在样式表导入体中,那么,样式表导入体中的匹配模板优先于被导入的样式表中的匹配模板。如果有多个被导入的样式表,并且在一个以上的被导入的样式表中存在匹配模板,则在样式表导入体中列出被导入的样式表的顺序控制了将选择哪一个匹配模板(例如,使用具有匹配的第一个列出的被导入的样式表)。在XSLT样式表中,可以在xsl:import元素中阐述被导入的样式表。
由样式表编译器20独立地编译“主要”(导入体或包体)样式表和每一个被导入或被包括的样式表。在被包括的样式表的情况下,主要样式表和被包括的样式表的数据结构可以合并到由表达式处理器42使用的一个数据结构集合。在被导入的样式表的情况下,数据结构可以仍分开,表达式处理器42可以并行地向文档应用数据结构。这样的实施例可以类似于表达式处理器42的实施例,只是匹配表达式中的冲突可以利用实现了上文所描述的冲突解决方案的冲突解决方案逻辑来进行处理。
在一些实施例中,样式表可以包括引用了一个或多个文档(正在向其应用样式表的文档之外的文档)的语句。样式表可以进一步包括处理被引用的文档的语句。在一个实施例中,样式表编译器20可以标识无条件地使用哪些被引用的文档(即,在样式表应用于任何文档的每一种情况下,都可以使用被引用的文档)。当对输入文档的处理开始时,内容转换设备10可以获取无条件地被引用的文档,可以按照在样式表中被引用的顺序对无条件地被引用的文档进行分析。如果转换引擎44将执行使用了被引用的文档的指令,并且该被引用的文档的分析还没有开始,则转换引擎44可以上下文切换到不同的任务。对于有条件地被引用的文档,响应转换引擎44试图执行使用文档的指令的情况,内容转换设备10可以获取文档,此时可以对文档进行分析,如上文对待无条件地被引用的文档那样。在其他实施例中,当在输入文档上调用一个样式表时,内容转换设备10可以获取对应于该样式表的所有被引用的文档,或响应转换引擎44试图执行使用该被引用的文档的指令的情况,可以获取每一个被引用的文档。
图6是说明了架构编译器22的一个实施例的流程图。在其中架构编译器22是以软件实现的实施例中,架构编译器22包括指令,当执行这些指令时,实现了图6所示的功能。值得注意的是,尽管图6中的方框显示了架构编译器22的功能,但是,该流程图并不意味着,编译器按照所列出的顺序来执行功能,也不意味着,在开始下一功能之前,样式表上的一个功能必须整个地都完成。
类似于样式表编译器20,架构编译器22可以向架构(或DTD)中的节点标识符分配序列号(方框70)。由样式表编译器20分配给给定节点标识符的序列号可以不与由架构编译器分配的序列号相同。
架构编译器22可以生成许多供分析器电路40使用的表。例如,实体引用可以被包括在文档中,并且架构/DTD可以定义实体的值。可以创建DTD实体引用表,以将实体引用映射到对应值。此外,如果可以包括属性的给定元素不包括属性,则架构/DTD可以指定属性的默认值。可以创建DTD默认属性,以记录属性和默认值。此外,还可以创建标识了允许的和必需文档结构的骨架树,供验证器用来判断文档是否有效(如架构/DTD中所定义的)。架构编译器22向存储器18输出符号表、DTD表,以及骨架树(方框72)。
现在请参看图7,该图显示了分析器电路40、分析器电路40的一个实施例的输入数据结构和输出数据结构的方框图。在所说明的实施例中,由分析器电路40使用的输入数据结构可以包括DTD实体引用表34A和DTD属性列表34B(可以是DTD表34的某些部分)、空格表32,以及符号表24。分析器40可以创建并使用动态符号表39A(文档处理器结构39的一部分)和一组被分析的内容表39B(文档处理器结构39的一部分)。具体来说,在所说明的实施例中,被分析的内容表39B可以包括骨架表80、元素索引表82、元素名称/值表84、属性索引表86、属性名称/值表88、属性列表90、处理指令/注释(PI/C)表92、PI索引表94,以及元素目录(TOC)96。被分析的内容表39B可以用于转换引擎44中的文档转换。在一些实施例中,分析器电路40还可以被配置为对于只分析请求以SAX或DOM格式输出被分析的内容。
分析器电路40可以被配置为在从处理器14A接收到文档时对文档进行分析(图7中未显示),以生成被分析的内容表39B。一般而言,被分析的内容表39B可以包括各种文档内容的表,并带有将信息链接到各个节点的指针。下面提供了关于如图7所示的被分析的内容表39B的比较详细的信息。此外,分析器电路40还可以:(i)对于文档中的每一个节点,生成前缀次序和后缀次序编号;(ii)将实体引用代替为来自DTD/架构的实体值;(iii)将预先定义的实体引用(如XML规范中所描述的)代替为对应的字符;(iv)添加来自DTD/架构的默认属性和/或属性值;(v)将CDATA部分代替为字符;(vi)按样式表所指示的,剥离或保留空格,并规范化空格;以及(vii)标识嵌入的DTD/样式表或对DTD/样式表的嵌入的引用。
为将实体引用代替为实体值,分析器40可以使用DTD实体引用表34A。如果在文档中遇到了实体引用,则分析器电路40可以查询DTD实体引用表34A中的实体引用,并从DTD实体引用表34A中读取对应的实体值。实体值为文档代替由分析器电路40输出的被分析的内容中的实体引用。在一个实施例中,DTD实体引用表34A可以包含具有多个条目的初始部分,其中,每一个条目都存储了散列的实体引用(例如,循环冗余代码(CRC)-16散列),还包括指向DTD实体引用表34A的第二部分的指针,在该第二部分,存储了包括实体值的字符串。分析器电路40可以散列文档中检测到的实体引用,并将散列与DTD实体引用表34A的初始部分中的散列值进行比较,以定位第二部分中的匹配实体值。
为将默认属性或属性值添加到文档,分析器电路40可以使用DTD属性列表34B。DTD属性列表34B可以包含各个元素名称的默认属性和/或属性值,分析器电路40可以查找文档内的元素开始标记中检测到的元素名称,以判断对于元素是否包括了任何默认属性或属性值。如果包括了默认值,则分析器40可以跟踪元素开始标记中包括的属性,直到检测到元素关闭。如果元素中没有包括DTD属性列表34B中的属性和/或属性值,则分析器电路40可以从DTD属性列表34B插入属性/属性值。在一个实施例中,DTD属性列表34B可以具有包括被散列的元素名称(例如,CRC-16散列)的初始部分和指向DTD属性列表34B的第二部分的指针。第二部分可以包括被散列的属性名称(例如,CRC-16散列)和指向DTD属性列表34B的第三部分的指针,在该第三部分,作为字符串存储了默认属性名称/值。分析器电路40可以散列元素名称,查询初始部分中的散列,并且,如果在第一部分查找到匹配,则从第二部分读取被散列的属性名称和指针。随着检测到每一个属性名称,分析器电路40可以散列属性名称,并将它们与来自DTD属性列表34B的被散列的属性名称进行比较。当检测到元素关闭时,文档中的没有被分析器电路40检测出的任何被散列的属性名称可以是需要其默认值的属性,可以从DTD属性列表34B的第三部分读取默认值,并插入到被分析的内容表39B中。
空格表32可以指出哪些元素名称将被剥离空格,如样式表所指定的。在一个实施例中,可以散列将剥离其空格的每一个元素名称(例如,CRC-16散列算法),散列值存储在表中。当分析器电路40检测到文档中的元素名称时,分析器电路40可以散列元素名称,并在空格表32中查找它。如果查找到匹配,则分析器电路40可以从元素中剥离空格。否则,分析器电路40可以将空格保留在元素中。
如上所述,符号表24可以将节点标识符映射到由样式表编译器所分配的序列号。分析器电路40可以使用符号表24以将文档中的元素或属性名称(如果使用了命名空间,则由命名空间前缀限定)转换为序列号,以传递给表达式处理器42。然而,文档有可能包含不以样式表表示的元素或属性。在这样的情况下,分析器电路40可以分配序列号,并将序列号存储在动态符号表39A中。图8的流程图显示了当检测文档中的元素或属性时分析器电路40的操作的一个实施例。
分析器电路40可以扫描编译器的符号表24,以查找节点标识符(例如,元素/属性名称,可选地,带有命名空间前缀)(方框100)。如果发现了一个条目(判断方框102,“是”支线),则分析器电路40可以从编译器的符号表24中读取序列号(方框104)。如果没有发现一个条目(判断方框102,“否”支线),则分析器电路40可以扫描动态符号表39A以查找节点标识符(方框106)。如果发现了一个条目(判断方框108,“是”支线),则分析器电路40可以从动态符号表中读取序列号(方框110)。如果没有发现一个条目(判断方框108,“否”支线),则分析器电路40可以生成唯一的序列号(还没有记录在编译器的符号表24中,也没有记录在动态符号表39A中的序列号),并可以用生成的序列号和节点标识符更新动态符号表39A(方框112)。在任何情况下,分析器电路40都可以将一个事件中的序列号传输到表达式处理器42(方框114)。
值得注意的是,一个元素常常具有多个子(元素或属性),它们具有相同名称(例如,相同子元素或属性的多个实例)。如此,当在输入中检测到了一个节点标识符时,则下一个节点标识符有可能相同(或者,有可能在检测到的下面的几个名称内重现节点标识符)。在一些实施例中,分析器电路42可以保留一个或多个最近检测到的名称和对应的序列号,并在搜索符号表24和动态符号表39A之前,可以将新检测到的节点标识符与这些名称进行比较。
在一些实施例中,对于在编译器的符号表24中不匹配的节点,可以实施优化。由于编译器向样式表中的每一个节点标识符分配序列号,因此,已知,不匹配编译器的符号表24的节点也不匹配分析时表达式树36中的任何节点。分析器电路40可以在每一个事件中包括关于序列号是来自于编译器的符号表24还是来自于动态符号表39A的指示。如果序列号不是来自编译器的符号表24,则表达式处理器42可以不将事件与分析时表达式树36进行比较。表达式处理器42可以记录事件,用于其他目的(例如,对于一些事件类型,任何“/”表达式节点子节点都可以不必被随后的事件匹配)。
在一个实施例中,分析器电路40可以生成多个事件,并带有序列号地(在一些实施例中,还有前缀次序编号)传输到表达式处理器42。如果检测到元素开始标记,则可以生成元素开始事件,而序列号可以是对应于元素名称的序列号。如果检测到元素结束标记,则可以生成元素结束事件,而序列号可以是对应于元素名称的序列号。如果在元素开始标记中检测到属性名称,则可以生成属性名称事件,序列号可以是属性名称的序列号。当检测到元素开始标记的末尾时,可以生成元素关闭事件,而序列号可以是元素的序列号。还可以生成配置事件,以为表达式处理器42建立所希望的样式表/文档上下文。
在一个实施例中,可以作为单个字符的树来排列符号表24。表中的每一个条目都可以包括字符、叶节点指示、级别结尾指示,以及指向条目的第一个子条目的指针或者如果条目是节点标识符的最后一个字母,则为序列号。从表的顶部开始,在一个条目中提供了名称的每一个唯一第一字符,条目被表示为非叶节点,指针被设置为存储了名称的下一字符的第一条目。具有第一字符的名称的每一个唯一第二字符分组在指针中的一系列条目中,并具有指向第一子(第三字符)等等的指针。当到达给定名称的最后一个字符时,叶节点指示指出了该条目是叶,指针字段是序列号。当到达级别中的最后一个唯一字符时,由级别结尾指示指出系列的结尾。类似地,可以使用级别结尾指示来标记条目的第一级别的结尾(对于名称的第一字符)。如此,对符号表24进行扫描可以包括沿着树向下一个字符一个字符地,将检测到的名称与符号表24中的字符进行比较。
在一个实施例中,可以以稍微不同的方式来组织动态符号表39A。名称基于名称中的第一字符而存储在“箱柜”中。名称的每一个可能的第一字符都可以被用作到动态符号表39A的偏移。这些偏移中的每一个条目都可以包括bin指针和“bin中的最后一个条目”指针。在bin指针中有包括名称的其余部分的字符串(即,字符2到名称的结尾)、系列ID以及指向下一个bin条目的指针(即,bin条目可以是链接列表)。可以将检测到的名称与bin条目中的字符串进行比较,如果检测到匹配,可以使用系列ID。否则,使用指向下一个bin条目的指针来读取下一个bin条目。如果到达了bin的结尾而没有检测到匹配,那么,为bin中的名称添加新条目(并分配序列号)。在一个特定实施例中,每一个bin条目都可以包括一个或多个分项,这些分项被配置为存储了多个字符(例如,2)和定义了所有字符都是有效的或者定位多个字符内的字符串字符的结尾的代码。“bin中的最后一个条目”指针可以指向bin中的最后一个条目,并可以用来在添加新条目时更新下一个bin指针。
现在进一步详细描述一个实施例的被分析的内容表39B。分析器电路40标识文档结构/内容,并基于检测到的结构/内容,将文档内容写入到被分析的内容表39B中的各个数据结构。例如,分析器电路40可以将检测到的元素名称(和对应的元素值/文本节点)存储在元素名称/值表84中,并可以作为字符串将检测到的属性名称(和对应的值)存储在属性名称/值表88中。对应的索引表82和86可以将指向对应的字符串的开始的指针分别存储在表84和88中。分别使用元素的序列号(图7中的ES/N)或属性(图7中的AS/N)来对索引表82和86进行寻址。
处理指令/注释(PI/C)表92存储了对应于处理指令和注释的字符串。注释可以作为存储在元素TOC 96中的指针所定位的字符串来进行存储。处理指令可以包括两个字符串值:处理指令目标部分(扩展名称)和处理指令值部分(来自文档的处理指令的其余部分)。可以用一对来自PI索引表94(用来自元素TOC 96的指针来索引)中的条目的指针来定位处理指令目标和处理指令值。PI索引表94条目可以包括该对指针和分配给处理指令的序列号。
分析器电路40还可以为文档中的每一个元素生成属性列表90。属性列表90可以是对应于该元素的属性的列表(按序列号),具有指向属性名称/值表88中的属性名称和属性值(如果有的话)的指针。此外,分析器电路40还可以为每一个元素生成元素TOC 96。元素TOC 96标识对应元素的子节点(例如,子元素、文本节点、注释节点,以及处理指令节点)。元素TOC 96中的每一个条目都可以包括节点位置(与节点内的其他子元素相比,标识子元素的位置),节点类型(将子节点标识为元素、文本、注释或处理指令),字段,该字段要么是节点内容指针(对于注释、处理指令或文本节点),或者子元素的前缀次序编号(对于元素节点)。节点内容指针是指向注释节点的PI/C表92的指针,指向处理指令节点的PI索引表94的指针,或指向文本节点的元素名称/值表84的指针。在一个实施例中,元素TOC 96可以是条目的链接列表,如此,每一个条目都可以进一步包括指向列表中的下一个条目的指针。
骨架表80可以包括文档中的每一个元素节点的条目,并可以通过元素节点的前缀次序编号来索引。在所说明的实施例中,骨架表的任何条目都包括父节点的前缀次序编号(PPREO)、元素节点的紧前面的同辈的前缀次序编号(IPSPREO),元素节点的后缀次序编号(PSTO),该编号也可以指出子树(元素节点的后代)中的最后一个前缀次序编号,元素序列号(ES/N),指向元素节点的属性列表90的属性列表指针(ALP),指向元素节点的元素TOC 96的目录指针(TOCP),以及指向模板列表38(在该模板列表中,列出了元素节点的匹配模板(如果有的话))中的条目的模板列表指针(TLP)。
值得注意的是,上文所描述的各个数据结构包括字符串。在一个实施例中,字符串长度(例如,字符数)可以作为字符串的第一“字符”存储,并且分析器电路40可以使用字符串长度来判断要读取多少字符。
对于XML文档,可以使用分析器电路40的上述示例以及其输出数据结构。在一个实施例中,分析器电路40包括用于对XML文档进行分析的硬件电路。在一些实施例中,分析器电路40还可以包括用于对关系数据库结构(如SQL、Oracle等等)进行分析的硬件电路。分析器电路40可以以类似于图7中所显示的数据结构的数据结构输出被分析的关系数据库结构,如此,表达式处理器42和转换引擎44不必知道输入是XML还是关系数据库。
在一些实施例中,分析器电路40可以是可编程的,以对其他文档类型进行分析。分析器电路40可以用一个或多个输入类型描述符来进行编程。输入类型描述符可以描述文档中的结构分隔符;指出文档在本质上是分层的还是表格的;指出分层文档是否具有对每一层结构的显式结束;如果结尾不是显式的,则定义如何检测结构的结尾;定义给定结构单元内的内部结构,如果有的话。
在一些实施例中,还可以包括预分析器电路,该预分析器电路过滤由CPU 14A-14B所提供的文档,以为分析器电路40生成已过滤的文档。即,分析器电路40可以只接收文档的通过了过滤器的那一部分,分析器电路40可以将接收到的部分当作文档的整体来进行分析。例如,如果提供了相对比较大的输入文档,但是只对该文档的一部分感兴趣,就可以使用预分析器。预分析器可以被编程为以任何所希望的方式对文档进行过滤(例如,从文档的开始,跳过一定数量的字符,然后捕获许多字符,或直到文档的结尾;在捕获文档内容之前,过滤到某一元素,或一定数量的元素;和/或标识文档的待捕获的部分的比较复杂化的表达式(例如,XPath表达式)等等。预分析器可以由用户编程,如果样式表具有丢弃文档内容的效果,则由样式表编译器20编程。
下面请参考图9,该图显示了表达式处理器42的一个实施例的表达式处理器42、输入数据结构、和输出数据结构的方框图。在所说明的实施例中,由表达式处理器42使用的输入数据结构包括分析时表达式树26、表达式列表36,以及模板列表38。表达式处理器42还可以生成并使用多个文档处理器结构39(具体来说,/堆栈39C、//堆栈39D、指针(Ptr)堆栈39E,以及属性(Attr)堆栈39F)。表达式处理器42可以向转换引擎44输出模板/表达式匹配列表39G。
一般而言,表达式处理器42从分析器电路40接收事件,并将其中标识的文档节点与分析时表达式树26中的表达式节点进行匹配。在对文档节点进行分析时内联地接收它们。如此,在任何给定的时间点,以前接收到的文档节点可能已经匹配了分析时表达式树的某些部分,但是还没有到达树的叶(其中,整个表达式已经与由分析器电路40提供的一组文档节点匹配)。表达式处理器42可以使用堆栈39C-39F来存储分析时表达式树26的已经匹配了前面的文档节点的那一部分,有效地保留了分析时表达式树26中的下一个文档节点可以与其进行比较的位置。
所说明的实施例可以用于XPath表达式,其中,节点之间的运算符可以包括父/子运算符(″/″)和后代/祖先运算符(″//″)。如此,给定表达式节点可以具有一个或多个/子和一个或多个//子。如果给定表达式节点具有/子并与一个文档节点匹配,则该给定表达式节点可以被推到/堆栈39C上。类似地,如果给定表达式节点具有//子并与一个文档节点匹配,则该给定表达式节点可以被推到//堆栈39D上。如果文档节点是属性,则该属性可以存储在Attr堆栈39F上。在一些实施例中,在开始处理事件时,保存了栈顶指针,以便可以恢复处理事件之前的堆栈状态。Ptr堆栈39E可以用来存储指针。
在其中在表达式处理器42中部分地对具有运行时部分的表达式进行求值的实施例中,在匹配列表39G中可以保留关于运行时部分的信息,以便可以执行运行时求值,并可以丢弃匹配列表39G中的不满足表达式的运行时部分的文档节点。如此,可以在表达式的具有运行时求值的每一个部分将匹配列表39G分组。具有由运行时部分使用的相同值的每一个文档节点都可以包括在给定组中。
如图9所示,匹配列表39G可以包括构成表达式的节点集的文档节点的组的分层阵列。对于分析时表达式树中的每一个表达式,都可以有这样的结构(即,图9所示的结构可以对应于一个表达式)。主要组(例如,图9中的PG0和PG1)可以对应于分析时表达式树中的顶级节点,对于匹配了顶级节点并且要么本身是节点集的成员,要么具有作为节点集的成员的后代的每一个不同的文档节点,可以有不同的主要组。每一个分组级都可以对应于运行时求值(例如,在一个实施例中,运行时谓词)。可以保留用于运行时谓词的值以及指向下一分组级别的指针(或指向节点列表本身的指针)。当出现表达式的匹配时,基于节点的分组级的值,节点被放置在组中。即,在给定级别,节点或者包括在其值匹配子组的子组中,或者,为节点创建新的子组。在所说明的示例中,第一子组级别(对应于第一运行时谓词)包括来自主要组0(PG0)的子组0和1(SG0和SG1)。类似地,主要组1(PG1)包括对应于第一运行时谓词的子组SGM和SGM+1。第二运行时谓词对应于第二子组级别,包括SGN和SGN+1作为子组SG0的子组。在此示例中,在表达式中有两个运行时谓词,如此,子组SGN和SGN+1两者都指向潜在地匹配文档节点的列表(例如,在所说明的示例中,节点N0、N1,以及N2)。在一个实施例中,可以在匹配列表39G中通过如分析器40所分配的前缀次序编号来表示文档节点。
通过使用分层结构,转换引擎44可以选择主要组,对第一运行时谓词进行求值,将第一运行时谓词与主要组的每一个子组进行比较(丢弃不满足第一运行时谓词的任何子组)。转换引擎44可以对第二运行时谓词进行求值,将第二运行时谓词与没有被丢弃的第一级别子组的每一个子组进行比较,并丢弃不满足第二运行时谓词的子组等等。在对每一个运行时谓词进行求值之后仍保留在结构中的节点是满足对应的表达式的节点集。转换引擎44可以在指令表30中查询对应于表达式的指令,并对节点集中的每一个节点执行这些指令。
在一个实施例中,如果分析时表达式树26中的第一表达式是第二表达式的后缀(即,第二表达式包括未包括在第一表达式中的前缀,但是,第一表达式的整体与第二表达式的结尾相同),那么,可以不必为第一表达式创建单独的匹配列表39G。相反,将创建第二表达式的匹配列表39G,并包括第一表达式的顶级节点的分组。对应于第一表达式的指针可以指向第二表达式的匹配列表39G内的第一表达式的顶级节点的分组。
在一个实施例中,匹配了给定表达式的节点本身可以由对应的模板正文进行操纵,或者可以操纵节点的值(例如,属性值或元素的内容)。对于分析时表达式树26中的每一个叶节点,样式表编译器20可以被配置为指出是否需要节点或节点的值。在一些实施例中,对于每一个节点,表达式处理器42还可以输出节点所匹配的模板的列表。
表达式列表36可以是样式表中包括的表达式的列表。样式表编译器可以向表达式分配表达式编号,并可以将表达式编号存储在表达式列表中。分析时表达式树叶节点中的指针可以指向表达式列表中的条目。每一个条目都可以存储表达式编号和指出需要分组的表达式树的级别的组签名。例如,在一个实施例中,组签名可以包括表达式树的每一个级别的位,0表示在该级别没有分组,1表示有分组。在一些实施例中,可以有一个以上的表达式对应于给定叶节点。例如,由于与另一个表达式匹配而被删除的编译时表达式可能导致两个表达式都开始被叶节点匹配。此外,给定样式表还可以在一个以上的位置具有等效的表达式。对于这样的实施例,匹配表达式编号的列表可以存储在表达式列表36的连续的条目中,这些条目可以包括最后一个表达式指示,该指示可以标识给定叶节点的最后一个匹配表达式。如果只有一个匹配表达式,则被表达式指针所指向的第一条目中的最后一个表达式指示可以让其最后一个条目指示处于指出了最后一个条目的状态。
模板列表38可以类似地包括具有模板编号和最后一个模板指示的条目,以允许给定叶节点有多个匹配模板。分析时表达式树36中的叶节点可以类似地包括指向一个或多个匹配模板的模板列表的指针。模板列表38可以进一步包括模板类型字段(例如,是否为被导入的,模板是否具有模数,以及模板是否具有一个或多个运行时谓词)、模数、对于被导入的类型标识从其导入了模板的样式表的导入标识符、指向标识要为模板执行的指令的指令表30的模板正文指令指针,指向标识要执行以对一个或多个运行时谓词进行求值的指令的指令表30的谓词指针。
图10显示了分析时表达式树26数据结构的一个实施例的方框图。在所说明的实施例中,分析时表达式树可以包括具有诸如条目120之类的多个条目的表,每一个条目都对应于表达式树中的表达式节点。每一个表达式节点都节点可以具有最多此实施例中的三种不同类型的零个或多个子节点:(1)/子节点,它们是文档树中的节点的子节点;(2)//子节点,它们是文档树中的节点的后代(要么是直接子节点,要么间接地通过一个或多个节点的子树);或(3)属性子节点(元素节点的属性)。此外,给定表达式节点可以是顶级节点,也可以不是顶级节点。在一个实施例中,分析时表达式树26可以包括多个树构成的“林”,每一个树都具有根。顶级节点是其中一个树的根,树可以表示以顶级节点开始的一个或多个表达式。顶级节点可以分组在分析时表达式树数据结构的顶部,具有指向下一级别中的节点的指针,如下面就条目120比较详细地描述的。
下面将描述条目120的字段。条目120包括用于顶级表达式节点的顶级类型(TLT)字段。顶级类型可以作为相对、绝对或祖先来编码。相对顶级节点是开始了相对于文档树中的上下文节点求值的一个或多个表达式的表达式节点,而绝对顶级节点是开始了从文档树的根节点求值的一个或多个表达式的表达式节点(即,一个或多个表达式以/开始,后面是顶级节点标识符)。祖先顶级节点是引用了上下文节点的祖先的表达式的开始(即,一个表达式或表达式以//开始,后面是顶级节点标识符)。
条目120包括存储了表达式节点的序列号的序列号(S/N)字段。将S/N与由分析器电路40传输的事件中标识的文档节点的序列号进行比较,以检测存储在条目120中的表达式节点上存在匹配(序列号相等)或不匹配。条目120进一步包括叶节点(LN)字段,该字段标识存储在条目120中的表达式节点是否为叶节点(即,是否已经到达表达式的结尾)。叶节点上的匹配使文档节点记录在对应于叶节点的每一个表达式/模板的匹配列表39G中。LN字段可以是位指示,当设置时,表达式节点是叶节点和指示,当清除时,表达式节点不是叶节点。其他实施例可以颠倒位的设置和清除含义或使用其他编码。
路径类型字段可以标识来自存储在条目120中的表达式节点的路径链接的类型(例如,要么/,//,要么两者)。例如,路径类型字段可以包括每一种类型的位,可以设置该位,以表示路径的类型是从此节点发生的,并可以清除,以表示路径的类型不存在。其他实施例可以颠倒位的设置和清除含义或使用其他编码。路径类型字段可以使“Ptr/”和“Ptr//”字段生效。Ptr/字段可以存储指向表达式节点的第一/子的指针(每一个/子都可以分组在分析时表达式树数据结构的连续的条目中,从Ptr/指针表示的条目开始)。类似地,Ptr//字段可以存储指向表达式节点的第一//子的指针(每一个//子都可以分组在分析时表达式树数据结构的连续的条目中,从Ptr//指针表示的条目开始)。Ptr Attr字段可以存储指向分析时表达式节点的第一属性节点的指针(每一个属性都可以分组在分析时表达式树数据结构的连续的条目中,从Ptr Attr指针表示的条目开始)。
EOL字段存储了关于条目120是否存储了作为当前树级的结尾的表达式节点的指示。例如,从指出级别结尾的分析时表达式树数据结构的顶部的第一条目可以表示最后一个顶级节点。从每一个指针开始(例如,Ptr/、Ptr//或Ptr Attr),条目是包含指针的条目的子,直到到达具有EOL字段的指出了级别结尾的条目。EOL字段可以是位指示,当设置时,表达式节点是级别的结尾和指示,当清除时,表达式节点不是级别的结尾。其他实施例可以颠倒位的设置和清除含义或使用其他编码。
如上所述,条目120进一步包括存储了指向表达式列表36中的条目的表达式列表指针的表达式列表指针(XLP)字段,存储了指向模板列表38中的条目的模板列表指针的模板列表指针(TLP)字段。XLP和TLP字段可以对叶节点有效。
在本实施例中,一些谓词在分析时可以是可求值的,可以使用谓词类型(PrTP)字段和谓词数据(PrDT)字段来表示这样的谓词。例如,可以对谓词类型字段进行编码,以表示没有可求值的谓词、位置谓词或属性名称谓词。谓词数据字段可以存储来自表达式的谓词数据(例如,位置谓词的位置号码,或对于属性名称谓词,属性名称或属性名称的序列号)。
图11是示范性表达式树122和对应于表达式树122的分析时表达式树条目120A-120E的对应的部分的方框图。表达式树122包括序列号为10的表达式节点124A,该表达式节点124A具有两个/子节点124B和124C(序列号为15和20),一个//子节点124D(序列号25),以及一个属性子124E(序列号30)。如此,表达式树122表示下列表达式(假设节点124A是相对顶级节点):10/15、10/20、10//25,以及10/attribute::30。
条目120A-120E说明了分析时表达式树条目的S/N、LN、EOL、Ptr/、Ptr//、以及Ptr Attr字段。条目120A对应于节点124A,如此包括序列号10。节点124A不是叶节点,如此,在条目120A中LN字段为零。对于此示例,EOL字段为1,因为节点124A是树122中的其级别中的唯一节点。条目120A的Ptr/字段指向条目120B(第一/子)。条目120A的Ptr//字段指向条目120D,条目120A的Ptr Attr字段指向条目120E。
条目120B包括S/N字段中的15,LN字段为1,因为节点124B是表达式树122的叶节点。然而,EOL字段是0,因为在此级别有另一个/子。条目120B的Ptr/、Ptr//,以及Ptr Attr字段是空值,因为这是叶节点。条目120C包括S/N字段中的20,LN字段为1,因为节点124C是表达式树122的叶节点。EOL字段也是1,因为节点124C是此级别中的最后一个/子。再者,由于条目120C是叶节点,因此,条目120C的Ptr/、Ptr//,以及PtrAttr字段是空值。
条目120D包括S/N字段中的25,LN字段为1,因为节点124D是表达式树122的叶节点。EOL字段也是1,因为节点124D是此级别中的最后一个//子。再者,由于条目120D是叶节点,因此,条目120D的Ptr/、Ptr//,以及Ptr Attr字段是空值。
条目120E包括S/N字段中的30,LN字段为1,因为节点124E是表达式树122的叶节点。EOL字段是1,因为节点124E是此级别中的最后一个属性子节点。再者,由于条目120E是叶节点,因此,条目120E的Ptr/、Ptr//,以及Ptr Attr字段是空值。
下面请参考图12A-12B、13、14A-14B,以及15,显示了流程图,这些流程图说明了表达式处理器42对于可以由分析器电路40生成的每一个事件的操作的一个实施例。每一个事件都可以包括已经检测到的文档节点的序列号(以及,在一些实施例中,还有文档节点的前缀次序编号)。表达式处理器44可以以硬件方式实现,如此,流程图可以表示硬件的操作,即使各个方框可以以硬件并行地执行或依照要求以硬件将其流水线化。流程图可以一般引用匹配文档节点和表达式节点。如前面所述,这样的匹配可以包括文档节点和表达式节点的匹配序列号。此外,流程图可以引用将节点输出到匹配列表。在一些实施例中,如前面所述,节点可以通过前缀次序编号在匹配列表中表示。
图12A-12B是说明了响应元素开始事件的表达式处理器42的一个实施例的操作的流程图。可以响应检测到文档中的元素开始标记来传输元素开始事件。
表达式处理器42可以弹出存储在/堆栈39C中的任何属性表达式节点,并可以将/堆栈指针推到指针堆栈39E(方框130)。由于新的元素正在启动,/堆栈上的任何属性表达式节点都将不会被匹配,因而,也不被需要。如果由元素启动事件标识的元素(在图12A-12B的描述中简称为“元素”)是文档的根节点,那么,不需要执行其他处理(判断方框132,“是”支线)。根节点可以不匹配分析时表达式树26中的任何节点,任何顶级节点都可以匹配根的子。如果元素不是根节点(判断方框132,“否”支线),但元素的父是根节点(判断方框134,“是”支线),表达式处理器42可以检查分析时表达式树26中的每一个顶级表达式节点,因为甚至可以对照根节点的子的绝对顶级节点检测到匹配(方框136)。另一方面,如果元素节点的父元素是根节点(判断方框134,“否”支线),则表达式处理器42可以检查分析时表达式树26中的每一个相对顶级表达式节点,因为对照不是根节点的子的节点的绝对顶级节点,可能检测不到匹配。
如果对照任何顶级节点没有检测到匹配(判断方框140,“否”支线),则流程图在图12B中的参考点A处继续。如果检测到匹配(判断方框140,“是”支线),并且表达式节点是叶节点(判断方框142,“是”支线),则元素节点被输出到对应于由分析时表达式树26的表达式节点的条目中的XLP和TLP指针所指向的表达式和/或模板的匹配列表(方框144)。如果被匹配的表达式节点不是叶节点(判断方框142,“否”支线),则表达式处理器42判断被匹配的表达式节点是否具有任何/或//子(分别为判断方框146和148),如果被匹配的表达式节点具有任何/或//子(分别为方框150和152),则将被匹配的表达式节点分别推到/堆栈39C和/或//堆栈39D。此外,/堆栈39C和//堆栈39D可以包括用于管理分析时谓词的匹配的被求值字段(通过分析时表达式树条目中的PrTP和PrDT字段指出)。如果有分析时谓词(通过PrTP字段来表示),被求值字段可以被设置为0。否则,被求值的字段可以被设置为2。流程图在图12B中的参考点A处继续。
在图12B中的参考点A处,取决于这次通过流程图是否为针对此元素的对/堆栈39C的第一次检查(判断方框154),流程图会以不同的方式进行操作。如果这是针对此元素的对/堆栈39C的第一次检查(判断方框154,“是”支线),则表达式处理器42判断元素的父是/堆栈39C中的匹配(判断方框156)。如果元素的父是/堆栈39C中的匹配(判断方框156,“是”支线),那么,被匹配的表达式节点的其中一个/子可以匹配该元素。表达式处理器42可以获取如被匹配的表达式节点的分析时表达式树条目中的Ptr/所示的被匹配的表达式节点的第一/子(方框158),并可以返回到图12A中的参考点B处,以判断是否在/子上检测到匹配(如果检测到匹配,则进行图12A中的方框142-152所示的处理)。如果元素的父不是/堆栈中的匹配(判断方框156,“否”支线),则表达式处理器42可以检查//堆栈39D(方框160)。类似地,如果此次通过不是此元素的/堆栈39C的第一次检查(判断方框154,“否”支线),并且已经从/堆栈中的被匹配的表达式节点获取了最后一个/子(判断方框162,“是”支线),则表达式处理器42可以检查//堆栈39D(方框160)。如果此次通过不是此元素的/堆栈39C的第一次检查(判断方框154,“否”支线),并且还没有从/堆栈中的被匹配的表达式节点中获取最后一个/子(判断方框162,“否”支线),表达式处理器42可以获取/堆栈中的被匹配的表达式节点的下一个/子,流程图可以在图12A中的参考点B处继续,以判断是否检测到该元素的匹配。如此,通过方框154-164的操作(并返回到图12A中的方框140-152),可以搜索表达式节点的匹配元素的父的每一个/子,以查找元素的匹配。
在一些实施例中,可以由表达式处理器42维护一个元素的父元素(例如,表达式处理器42可以保留一叠其元素开始事件已经产生,而其元素结束事件还没有产生的元素)。或者,在其他实施例中,可以由分析器电路40来维护父元素,也可以包括在元素开始事件中。
在本实施例中,对//堆栈39D进行搜索的过程与搜索/堆栈39C的过程稍微有点不同。一个节点可以匹配//堆栈39D上的任何表达式节点的//子(因为//运算符选择表达式节点的任何后代,//堆栈39D上的条目已经匹配了前面的元素,该元素是元素开始事件中标识的元素的父或祖先)。如此,图12B的流程图说明了搜索//堆栈39D上的每一个有效条目的//子的过程。
如果//堆栈39D没有有效的条目(或者再也没有有效条目)(判断方框166,“否”支线),则//堆栈处理完成,对元素开始事件的处理也完成。如果//堆栈39D具有有效条目(判断方框166,“是”支线),则表达式处理器42获取该条目的第一//,如条目中的Ptr//所示(方框168)。表达式处理器42将//子与元素进行比较,以判断是否检测到匹配(判断方框170)。如果检测到匹配(判断方框170,“是”支线),并且//子节点是叶节点(判断方框172,“是”支线),则类似于方框144,将元素输出到匹配列表(方框174)。类似于方框146-152,如果//子节点不是叶节点,并且检测到匹配,则表达式处理器42判断//子节点是否具有任何/或//子本身(分别为判断方框176和178),并如果//子节点具有任何/或//子(分别为方框180和182),则将//子节点分别推到/堆栈39C和/或//堆栈39D。此外,/或//堆栈39C-39D中的被求值的字段可以按照上文参考方框146-152所述的那样进行设置。
如果还没有处理当前//堆栈条目的最后一个子(判断方框184,“否”支线),则表达式处理器42获取当前//堆栈条目的下一个//子(方框186),流程图在判断方框170处对下一个//子继续执行。如果已经处理了最后一个子(判断方框184,“是”支线),表达式处理器42转到//堆栈39D中的下一条目(方框188),流程图在判断方框166对下一//堆栈条目继续执行。
图13说明了响应元素结束事件的表达式处理器42的一个实施例的操作。分析器电路40响应检测到文档中的元素结束标记来传输元素结束事件。
如果元素结束事件是针对文档的根节点的(判断方框190,“是”支线),则文档是完整的(方框192)。表达式处理器42可以清除堆栈39C-39F。如果元素结束事件不是针对文档的根节点的(判断方框190,“否”支线),则表达式处理器42可以弹出对应于结束元素的/和//堆栈条目(方框194)。由于元素正在关闭,元素的所有子元素以前都已经被分析。相应地,/和//堆栈中的对应于元素的任何条目(即,具有元素序列号的条目)不能被随后检测到的节点匹配。
图14A-14B说明了响应属性名称事件的表达式处理器42的一个实施例的操作。分析器电路40响应检测到文档中的元素开始标记内的属性名称来传输属性名称事件。属性名称可以通过其序列号来表示。
表达式处理器42可以将属性名称(即,其序列号)推到Attr堆栈39F。Attr堆栈39F累积用于进行元素关闭命令处理的属性名称(图15)。如果属性的父节点是根节点(判断方框202,“是”支线),那么,不需要执行其他处理(因为根节点没有属性)。另一方面,如果属性的父节点不是根节点(判断方框202,“否”支线),则表达式处理器42继续。
表达式处理器42可以检查每一个相对顶级表达式节点,以查找与属性名称的匹配(也是通过序列号来匹配)(方框204)。如果不存在与给定相对顶级表达式节点的匹配(判断方框206,“否”支线),则继续对下一相对顶级表达式节点进行处理,直到顶级表达式节点耗尽(判断方框208,“否”支线)。一旦耗尽了顶级表达式节点(判断方框208,“是”支线),处理在图14B中的参考点C处继续。
如果检测到匹配(判断方框206,“是”支线),并且节点是叶节点(判断方框210,“是”支线),则属性节点被输出到匹配列表39G(方框210)。表达式处理器42判断匹配的表达式节点是否具有任何/或//子(分别为判断方框212和214),如果匹配的表达式节点具有任何/或//子(分别为方框216和218),则将匹配的表达式节点分别推到/堆栈39C和/或//堆栈39D上。
在图14B中的参考点C处继续,表达式处理器42检查是否有/或//堆栈39C-39D中的属性名称的父节点的匹配(判断方框220)。如果没有检测到匹配(判断方框220,“否”支线),则属性名称事件的处理完成。如果检测到匹配,表达式处理器42检查匹配表达式节点表达式树条目的PrTP字段,以判断匹配表达式节点是否具有属性名称谓词(或在一个实施例中,预留的编码)。如果匹配表达式节点具有属性名称谓词,被求值的字段的最低有效位是清楚的(即,被求值的字段是0或2)(判断方框222,“是”支线),表达式处理器42可以将属性名称与匹配表达式节点的表达式树条目的PrDT字段进行比较。如果属性不匹配(判断方框224,“否”支线),表达式处理器42对/或//堆栈39C-39D中的下一匹配节点(如果有的话)继续进行处理。如果属性确实匹配(判断方框224,“是”支线),则在一个实施例中,表达式处理器42进行检查,以查看PrTP字段是否具有预留的编码(判断方框226)。在其他实施例中,可以取消判断方框226。如果PrTP字段具有预留的编码(判断方框226,“是”支线),则表达式处理器42可以为/或//堆栈39C-39D中的匹配表达式节点的被求值的字段的置位1(方框228)。如果PrTP字段没有预留的编码(判断方框226,“否”支线),则表达式处理器42可以将被求值的字段设置为3(方框230)。不论是哪一种情况,对属性名称事件的处理都可以完成。如果表达式处理器42试图执行属性值匹配,则在一些实施例中,可以使用预留的编码。其他实施例可以不必执行这样的匹配,在这样的实施例中,可以取消方框226和228。
如果判断方框222后面跟“否”支线,则表达式处理器42判断PrTP字段是否指出无分析时谓词或位置谓词(判断方框232)。即,表达式处理器42判断PrTP字段是否指出属性名称。如果PrTP字段没有被编码到“无”或“位置”(判断方框232,“否”支线),则表达式处理器42要么移到下一匹配/或//堆栈条目,要么,如果没有更多匹配条目,则结束处理(判断方框234,分别为“是”和“否”支线)。如果PrTP字段被编码为“无”或“位置”,则表达式处理器42判断表达式节点是否具有属性子节点(判断方框236)。如果表达式节点没有属性子节点(判断方框236,“否”支线),表达式处理器42要么移到下一匹配/或//堆栈条目,要么,如果没有更多匹配条目,则结束处理(判断方框234,分别为“是”和“否”支线)。如果表达式节点确实具有属性子节点(判断序列号236,“是”支线),则表达式处理器42获取该属性子节点(方框238),并将属性子节点与属性名称(序列号)进行比较。如果属性子节点匹配属性名称(方框240,“是”支线),并且属性子节点是叶节点(判断方框242,“是”支线),则表达式处理器42将属性名称节点输出到匹配列表39G。不管是否检测到属性匹配,如果有更多的属性子节点(即,属性子节点的EOL指示没有指出级别的结尾),那么,表达式处理器42获取下一属性子节点(方框238),并对方框240-244继续(判断方框246,“是”支线)。否则(判断方框246,“否”支线),表达式处理器42要么移到下一匹配/或//堆栈条目,要么,如果没有更多匹配条目,则结束处理(判断方框234,分别为“是”和“否”支线)。
图15说明了响应元素关闭事件的表达式处理器42的一个实施例的操作。分析器电路40响应检测到元素开始标记的关闭来传输元素结束事件(如此,对于此元素,在文档中已经检测到元素的所有属性)。响应元素关闭事件,表达式处理器42对照/堆栈39C中的任何匹配节点的属性子节点检查由分析器电路40以前标识的属性名称。
如果正在被关闭的元素的父节点是根节点(判断方框250,“是”支线),那么,则不执行其他处理。如果正在被关闭的元素的父节点不是根节点(判断方框250,“否”支线),表达式处理器检查/堆栈39C以查找具有指出了属性名称的PrTP字段的条目(方框252)。如果没有查找到匹配条目(判断方框254,“否”支线),则处理完成。如果查找到匹配条目(判断方框254,“是”支线),并且匹配条目的被求值的字段不是3(判断方框256,“否”支线),则处理也完成。如果查找到匹配条目(判断方框254,“是”支线),并且匹配条目的被求值的字段是3(判断方框256,“是”支线),则在方框258中继续进行处理。
表达式处理器42获取匹配表达式节点的属性子节点(方框258)。此外,表达式处理器42获取属性堆栈39F的属性名称(方框260)。表达式处理器42比较属性名称。如果检测到匹配(判断方框262,“是”支线),则属性节点被输出到匹配列表39G(方框264)。不论是哪一种情况,如果没有到达属性堆栈39F的结尾(判断方框266,“否”支线),则在方框260中对于属性堆栈39F中的下一属性继续进行处理。如果已经到达属性堆栈39F的结尾(判断方框266,“是”支线),并且还没有处理匹配表达式节点的最后一个属性子节点(判断方框268,“否”支线),则在方框258中对匹配表达式节点的下一属性子节点继续进行处理。如果已经到达属性堆栈39F的结尾(判断方框266,“是”支线),并且已经处理匹配表达式节点的最后一个属性子节点(判断方框268,“是”支线),则对元素关闭事件的处理完成。
值得注意的是,在图12A-12B、13、14A-14B,以及15的描述中的各个点,流程图引用了将节点输出到匹配列表39G。输出节点的操作可以包括将节点插入到对应于分析时表达式树26中的匹配的叶节点的表达式/模板的节点集合结构。输出节点的操作还可以进一步包括用如分析时表达式树26的叶节点中的模板列表指针所指示的模板编号(或列表)来更新由分析器电路40生成的骨架树。
值得注意的是,在上述各个点,表达式节点可以被称为被推到/堆栈39C或//堆栈39D中。将表达式节点推到堆栈39C-39D中的操作可以包括将节点的表达式树条目120推到堆栈中(或用于进行表达式匹配的表达式树条目的一部分)。依照要求,条目中可以包括补充信息(例如,指出匹配的进度的各种状态变量,如被求值的字段)。
下面请参考图16,显示了一个流程图,该流程图说明了转换引擎44响应接收到被分析的内容表39B和文档的匹配列表39G的情况的一个实施例的操作。转换引擎44可以以硬件方式实现,如此,流程图可以表示硬件的操作,即使各个方框可以以硬件并行地执行或依照要求以硬件将其流水线化。
对于每一个表达式,转换引擎44可以对表达式的任何运行时部分(例如,运行时谓词,在一个实施例中-方框270)进行求值。例如,在一个实施例中,模板列表38中的指针可以指出指令表30中的将由转换引擎44执行的指令,以对运行时谓词进行求值。在其他实施例中,可以以其他方式标识运行时谓词(例如,类似于分析时表达式树26的运行时表达式树)。响应运行时谓词求值,转换引擎44可以从节点集合结构中选择满足运行时表达式的组(方框272)。转换引擎44可以执行来自指令表30中的对应于表达式的指令(例如,可以由模板列表38中的模板正文指针来定位指令)。可以在所选择的组中的每一个节点上执行指令,结果可以输出到输出生成器46(方框276)。
在一个实施例中,转换引擎44可以包括多个硬件处理器,用于执行由样式表编译器20生成的指令。即,可以定义处理器的指令集,并且样式表编译器20可以生成指令集中的指令。在一些实施例中,指令集被设计为容纳对XSLT语言的扩展。转换引擎44可以将在特定节点上执行的指令调度到某一个处理器,该处理器可以在该节点上执行指令以生成结果。
在一个实施例中,为对运行时谓词进行求值而执行的指令可以这样排序,以便同时对类似的谓词(例如,具有共同前缀部分的谓词)进行求值,以便获取节点以对谓词进行求值的过程可以最小化。例如,基于匹配节点的后面的节点的谓词可以分组在一起,并同时对它们进行求值。
在某些情况下,可以使用表达式来声明样式表中的变量和/或参数,以后指令可以使用变量/参数。定义了变量/参数的表达式可以包括在分析时表达式树26中,如此,表达式处理器42可以对表达式进行求值(或者,如果表达式包括运行时谓词,则部分地求值)。可以以与其他运行时谓词类似的方式对运行时谓词进行求值。在一些实施例中,样式表编译器20可以试图在使用变量/参数的指令的前面对用于对变量/参数进行求值的指令进行排序,以降低在对变量/参数进行求值之前由转换引擎44尝试执行指令的可能性。转换引擎44可以包括一个等待队列,可以向该队列中放置使用变量/参数并且在变量/参数被求值之前尝试的指令,可以重新尝试指令,并将指令重新放置到等待队列中,直到变量/参数被求值。在其他实施例中,样式表编译器20可以明确地标识依赖于各个变量/参数的指令,在试图执行每一个指令之前,转换引擎44可以检查这样的依赖关系。在其他实施例中,样式表编译器20可以重新排列指令,以确保给定指令不在其依赖关系被满足之前执行。例如,样式表编译器20可以构建指令的在拓扑上排序的数据相关图,并可以向给定级别中的每一个指令分配组号。转换引擎44可以不选择具有给定组号的给定指令来执行,直到选择了前面的组中的所有指令来执行。
值得注意的是,上文所描述的指向各个数据结构的指针(以及在各个数据结构内)可以是全指针(仅指定正在被指向的数据的地址)或者可以依照要求,从包含正在被指向的数据的结构的基址偏离。
表达式处理器。其他实施例
下面参考图17-24B描述表达式处理器42的另一个实施例。此实施例可以使用有点不同的分析时表达式树形结构,并可以处理其他表达式。在此示例中使用了XML节点构造,虽然其他实施例可以使用其他标记语言。通过图17-24B说明的实施例可以匹配任何节点(例如,元素、属性、处理指令、注释、文本等等),包括可以使用按文档排序查找到的节点被求值的谓词。流程图可以一般引用匹配文档节点和表达式节点。如前面所述,这样的匹配可以包括文档节点和表达式节点的匹配序列号。此外,流程图可以引用将节点输出到匹配列表。在一些实施例中,如前面所述,节点可以通过前缀次序编号在匹配列表中表示。
图17是说明了包括条目300的分析时表达式树26的另一个实施例的方框图。在图17中,用于空间原因,条目300被显示为两行。条目300可以对应于分析时表达式树26中的一个表达式节点,如此,对于每一个表达式节点,可以有类似于条目300的条目。
类似于图10所示的条目120,条目300包括顶级类型(TLT)字段、序列号(S/N)、叶节点(LN)字段、级别结尾指示(EOL)字段、表达式列表指针(XLP)字段、模板列表指针(TLP)字段、谓词类型(PrTP)字段,以及谓词数据(PrDT)字段。此外,条目300可以包括节点类型(NT)字段、子描述符(CD)字段、Ptr/字段、Ptr//字段、Ptr/Attr字段、Ptr//Attr字段、Ptr/PI字段,以及Ptr//PI字段。值得注意的是,图17所示的字段的顺序可以不对应于存储器中的字段的顺序。相反,显示的条目300的字段仅说明分析时表达式树条目的一个实施例的内容。
对应于条目300的表达式节点可以具有各种子表达式节点。条目300的CD字段可以存储表达式节点具有哪些子表达式节点类型的指示。例如,图18包括说明了CD字段的编码的一个实施例的表302。在图18中所说明的实施例中,CD字段可以包括针对每一个子节点类型和该类型的/或//子的位。例如,在所说明的实施例中有六个子节点类型(元素、属性、文本、注释、处理指令(PI),以及具有文字的处理指令(PI-literal))。每一种类型可以是表达式节点的/子或者//子,如此,在此实施例中,CD字段包括12个位。如果设置了对应的位,那么,表达式节点至少具有给定类型的一个子表达式节点(以及/或//)。例如,如果表达式节点至少具有一个/子元素节点,可以设置CD字段的位11。如果表达式节点至少具有一个//子元素节点,则可以设置CD字段的位10。其他实施例可以颠倒设置以及清除状态的含义,也可以使用任何所希望的编码。CD字段可以用来判断给定表达式节点是否具有给定类型的任何子,作为表达式匹配过程的一部分。
NT字段可以存储节点类型,该节点类型标识了对应于条目300的表达式节点的类型。例如,图18包括了说明NT字段的示范性编码的表304。在示范性实施例中,NT字段可以包括三个位编码,在表304的左列中显示了其二进制值。右列列出了此实施例的各种节点类型(例如,元素、属性、文本、注释、PI、节点,以及具有目标的PI)。其他实施例可以使用任何其他编码,并支持所显示的类型的任何子集或超集。
在所说明的实施例中,条目300可以包括六个指向分析时表达式树26中的子节点条目的指针。Ptr/Attr指针可以指向是表达式节点的/子的属性节点。/属性子节点可以分组在分析时表达式树26中,从Ptr/Attr指针所指出的条目开始。Ptr//Attr指针可以指向是表达式节点的//子的属性节点。//属性子节点可以分组在分析时表达式树26中,从Ptr//Attr指针所指出的条目开始。Ptr/PI指针可以指向是表达式节点的/子的PI节点。/PI子节点可以分组在分析时表达式树26中,从Ptr/PI指针所指出的条目开始。Ptr//PI指针可以指向是表达式节点的//子的属性节点。//PI子节点可以分组在分析时表达式树26中,从Ptr//PI指针所指出的条目开始。表达式节点的其他/子节点(即,不是属性或PI节点)被分组在分析时表达式树26中的Ptr/指针(对于表达式节点的/子)和Ptr//指针(对于表达式节点的//子)处。
尽管所说明的实施例提供了单独的指针集,来定位属性子节点、处理指令子节点,以及剩余子节点,其他实施例可以实现不同的指针集。例如,一个实施例可以只包括一个指针集:/指针和//指针来分别定位所有/子以及所有//子。其他实施例可以对于每一种节点类型实现/和//指针,或者依照要求以其他方式将节点分组在指针处。
在此实施例中,如图18中的表306所示,PrTP字段可以具有编码。在此实施例中,谓词类型可以包括无谓词(具体来说,包括无分析时的可求值谓词)、位置谓词、元素子谓词、属性名称谓词、具有名称谓词的PI节点测试、节点测试谓词、注释节点测试谓词、PI节点测试谓词,以及文本节点测试谓词。节点测试谓词可以简单地测试,有(任何类型)的节点作为表达式节点的子或后代。注释节点测试、PI节点测试(没有名称),以及文本节点测试谓词可以测试是否存在给定类型的节点。具有名称的PI节点测试可以测试是否存在具有名称的具有PI目标的PI节点。其他实施例可以使用任何其他编码,并可以支持所显示的谓词类型的任何子集或超集。
在一些实施例中,表达式列表36和模板列表38可以具有与参考图9所描述的结构的类似的结构。此外,在一个实施例中,每一个模板列表条目都可以包括节点ID,该ID标识了,在对应于该模板列表条目的模板匹配表达式中正在引用哪一个子节点(如果适用)。例如,模板列表38可以根据对于给定表达式匹配的最后一个元素来进行组织(即,表可以包括被元素匹配的表达式的最后一个元素的列表,即使表达式包括元素的非元素子节点)。可以包括在该元素节点的表达式列表中的某些表达式中的属性、文本、注释或处理指令子节点可以由节点ID来进行标识。节点ID可以标识子节点的类型。此外,对于属性和处理指令,节点ID可以分别标识节点内的相对于其他属性和处理指令的位置。节点ID为0可以表示对于对应的表达式,没有元素节点的子节点。
在此实施例中,分析器电路40可以为表达式处理器42生成下面的事件:顶级元素开始事件、元素开始事件、元素结束事件、属性名称事件、文本事件、注释事件、处理指令事件以及配置事件。可以生成配置事件,以便为表达式处理器42建立所希望的样式表/文档上下文。
顶级元素开始事件可以标识是根的子的元素的开始。是根之外的其他元素的子的元素的开始由元素开始事件标识。例如,在使用XML的实施例中,元素开始事件可以指出已经检测到元素开始标记。每一个事件都可以包括元素的序列号。在一些实施例中,事件还可以包括元素的子位置和/或元素的前缀次序编号。这些事件可以使表达式处理器42试图将元素匹配到分析时表达式树26中的表达式。
可以响应检测到元素的结尾(例如,在使用XML的实施例中已经检测到元素结束标记)而生成元素结束事件。表达式处理器42可以响应其元素结束事件清空被元素匹配的任何表达式分支。
可以响应检测到属性名称的情况而生成属性名称事件。属性名称事件可以包括属性名称的序列号,在一些实施例中,可以包括元素所对应的属性的前缀次序编号。表达式处理器42可以试图响应属性名称事件将属性名称匹配到表达式树中的表达式。
可以响应检测文档中的文本而生成文本事件。文本事件可以包括对应元素的前缀次序编号,并可以使表达式处理器42检查表达式树中的表达式,以查找文本节点测试或文本表达式节点的匹配。类似地,可以响应检测文档中的注释节点而生成注释事件。注释事件可以包括对应元素的前缀次序编号,并可以使表达式处理器42检查表达式树中的表达式,以查找注释节点测试或注释表达式节点的匹配。
可以响应检测到处理指令而生成处理指令事件。处理指令事件可以包括处理指令的序列号,在一些实施例中,还可以包括对应元素的前缀次序编号。表达式处理器42可以试图将处理指令匹配到处理指令节点测试,有或者没有文字,或匹配到处理指令表达式节点。
下面请参考图19A-19B,显示了一个流程图,该流程图说明了响应元素开始事件(包括元素开始和顶级元素开始事件),使用图17中所示的分析时表达式树26,表达式处理器42的一个实施例的操作。一般而言,处理可以包括检查相对顶级表达式节点(如果事件是顶级元素开始事件,还包括非相对顶级表达式节点),以查看是否有元素的匹配,以及检查元素是否满足/和//堆栈39C和39D上表达式节点的谓词或者是这样的表达式节点的元素子节点。
表达式处理器42可以将/和//堆栈指针推到指针堆栈39E中(方框310)。具体来说,在所说明的实施例中,指针堆栈39E可以分别包括/堆栈指针的/Ptr堆栈和//堆栈指针的//Ptr堆栈。或者,其他实施例可以将两种指针推到同一个堆栈中。当对应元素结束事件发生时,可以随后弹出指针,以将/堆栈39C和//堆栈39D的状态恢复到检测到元素之前的状态(允许另一个元素匹配到在正在结束该元素之前匹配的表达式)。由元素开始事件标识的元素在图19A-19B的描述中被简称为“元素”。取决于是否已经接收到顶级元素开始事件(判断方框312),表达式处理器42可以检查分析时表达式树中的每一个顶级表达式节点(例如,包括绝对和祖先顶级表达式节点)(方框316)或每一个相对顶级表达式节点(方框314),以查找匹配。如果元素不是根节点(判断方框132,“否”支线),但元素的父是根节点(判断方框134,“是”支线),表达式处理器42可以检查分析时表达式树26中的每一个顶级表达式节点,因为甚至可以检测到与根节点的子的绝对顶级节点的匹配(方框136)。另一方面,如果事件不是顶级元素开始事件(判断方框312,“否”支线),则表达式处理器42可以检查分析时表达式树26中的每一个相对顶级表达式节点,因为对照绝对顶级节点,可能检测不到匹配(方框314)。
如果对照任何顶级节点没有检测到匹配(判断方框318,“否”支线),则流程图在图19B中的参考点D处继续。如果检测到匹配(判断方框318,“是”支线),并且表达式节点是叶节点(判断方框320,“是”支线),则元素节点被输出到对应于由分析时表达式树26的表达式节点的条目中的XLP和TLP指针所指向的表达式和/或模板的匹配列表(方框322)。表达式处理器42判断匹配的表达式节点是否具有任何/或//子(分别为判断方框324和326),如果匹配的表达式节点具有任何/或//子(分别为方框328和330),则将匹配的表达式节点分别推到/堆栈39C和/或//堆栈39D上。表达式处理器42可以使用分析时表达式树26中的表达式节点的条目的CD字段来检测是否有/或//子。此外,/堆栈39C和//堆栈39D可以包括用于管理分析时谓词的匹配的eval字段(通过分析时表达式树条目300中的PrTP和PrDT字段指出)。如果有分析时谓词(通过PrTP字段不等于0来表示),eval字段可以被设置为0。否则,eval字段可以被设置为1。流程图在图19B中的参考点D处继续。
在图19B中的参考点D处继续,搜索/和//堆栈以查看元素是否匹配以前匹配的表达式节点的子或谓词(存储在/或//堆栈的其中一个条目中)。如果/和//堆栈是空的(判断方框332,“是”支线),则对于此元素,匹配结束。否则(判断方框332,“否”支线),选择一个堆栈条目。如果该条目中的eval字段被设置为1,则所选择的堆栈条目中的对应的表达式节点要么没有谓词,要么谓词已经被以前分析的文档节点满足。相应地(判断方框334,“eval=1”支线),表达式处理器42可以检查所选择的堆栈条目中的表达式节点的任何元素子节点,以判断元素是否匹配任何元素子节点。可以考虑/元素子节点和//元素子节点。具体来说,如果表达式节点没有元素子节点(如分析时表达式树条目300的CD字段中所指出的)(判断方框336,“否”支线),对于该元素,匹配过程结束。或者,表达式处理器42可以转到下一个堆栈条目(方框362)以便进行处理。如果表达式节点具有元素子节点(判断方框336,“是”支线),则表达式处理器42获取表达式节点的第一元素子节点(方框338)。例如,该条目的Ptr/或Ptr//指针可以用来定位子节点(以及子表达式树条目中的NT类型字段)。如果子元素节点匹配元素(方框340,“是”支线),并且子元素节点是叶节点(判断方框342,“是”支线),则节点被输出到匹配列表(方框344)。此外,如果匹配的子元素节点分别具有/或//(判断方框346和348),则匹配的子元素节点分别被推到/堆栈39C或//堆栈39D(方框350和352),如上参考方框324-330所描述的,eval字段被初始化。不管子元素节点是否匹配元素,表达式处理器42都判断是否已经处理了最后一个元素子节点(判断方框354)。如果没有,则获取下一个子元素节点(方框338),并以类似的方式对其进行处理。如果子元素节点是当前堆栈条目的最后一个元素子节点(判断方框354,“是”支线),则表达式处理器42可以转到下一个堆栈条目(方框362)并处理元素子节点和谓词。
如果所选择的堆栈条目的PrTP字段等于4,或者元素子节点,那么,元素可以满足所选择的堆栈条目中的表达式节点的谓词是可能的。如此(判断方框334,“PrTP=4”支线),表达式处理器42可以将元素序列号与所选择的堆栈条目的PrDT字段进行比较(方框356)。如果元素匹配PrDT字段(判断方框358,“是”支线),则元素满足谓词,并且表达式处理器42将所选择的堆栈条目的eval字段设置为1(方框360)。不论是哪一种情况,表达式处理器42都可以转到下一个堆栈条目(方框362)。
值得注意的是,给定堆栈条目可以让eval字段等于0,让PrTP字段不等于4。在这样的情况下,表达式处理器42可以转到下一个堆栈条目(方框362)。
现在请参看图20,显示了一个流程图,该流程图说明了响应元素结束事件,使用图17所示的分析时表达式树26,表达式处理器42的一个实施例的操作。
如果元素结束事件是针对文档的根节点的(判断方框370,“是”支线),则文档是完整的(方框372)。表达式处理器42可以清除堆栈39C-39F。如果元素结束事件不是针对文档的根节点的(判断方框370,“否”支线),则表达式处理器42可以从Ptr堆栈39E弹出/和//堆栈指针(方框374)。由于元素正在结束,元素的所有子元素以前都已经被分析。相应地,/和//堆栈中的对应于元素的任何条目(即,具有元素的序列号的条目)不能被随后检测到的节点匹配。事实上,恢复当检测到元素的元素开始事件时推入的/和//堆栈指针会弹出/和//堆栈39C-39D上的对应于结束元素的条目,并将它们的状态恢复到对该元素进行处理之前的状态(可以是用于处理下一个检测到的元素的正确状态)。
现在请参看图21A-21B,显示了一个流程图,该流程图说明了响应属性名称事件,使用图17所示的分析时表达式树26,表达式处理器42的一个实施例的操作。由属性名称事件标识的属性在图21A-21B中的描述中被称为“属性”。一般而言,处理可以包括检查相对顶级表达式节点,以查看是否有属性的匹配,以及检查属性是否满足/和//堆栈39C和39D上的表达式节点的谓词,或者是这样的表达式节点的属性子节点。
如果属性的父节点是根节点(判断方框382,“是”支线),那么,不需要执行其他处理(因为根节点没有属性)。另一方面,如果属性的父节点不是根节点(判断方框382,“否”支线),则表达式处理器42继续。
表达式处理器42可以检查每一个相对顶级表达式节点,以查找与属性的匹配(方框384)。如果存在与给定相对顶级表达式节点的匹配(判断方框386,“是”支线),并且节点是叶节点(判断方框388,“是”支线),则将属性节点输出到匹配列表39G(方框390)。不管是否存在匹配,都可以对下一相对顶级表达式节点继续处理,直到顶级表达式节点耗尽(判断方框392,“否”支线)。一旦耗尽了顶级表达式节点(判断方框392,“是”支线),处理在图23B中的参考点E处继续。
在图21B中的参考点E处继续,搜索/和//堆栈以查看属性是否匹配以前匹配的表达式节点的子或谓词(存储在/或//堆栈的其中一个条目中)。如果/和//堆栈是空的(判断方框394,“是”支线),则对于此属性,匹配结束。否则(判断方框394,“否”支线),选择一个堆栈条目。如果该条目中的eval字段被设置为1,则所选择的堆栈条目中的对应的表达式节点要么没有谓词,要么谓词已经被以前分析的文档节点满足。相应地(判断方框334,“eval=1”支线),表达式处理器42可以检查所选择的堆栈条目中的表达式节点的任何属性子节点,以判断属性是否匹配任何属性子节点。可以考虑/和//属性子节点。具体来说,如果所选择的条目中的表达式节点没有属性子节点(如所指出的,例如,在分析时表达式树条目300的CD字段中)(判断方框398,“否”支线),则表达式处理器42可以判断是否已经处理了堆栈中的最后一个表达式节点(判断方框400)。如果是(判断方框400,“是”支线),则对于该属性,处理结束。否则(判断方框400,“否”支线),表达式处理器42可以转到下一个堆栈条目(方框410)以便进行处理。如果所选择的条目中的表达式节点具有属性子节点(判断方框398,“是”支线),则表达式处理器42获取该条目的第一属性子节点(方框402)。例如,条目的Ptr/Attr或Ptr//Attr指针可以用来定位属性子节点。如果子属性节点匹配属性(方框404,“是”支线),则该节点被输出到匹配列表(方框406)。不管子属性节点是否匹配属性,表达式处理器42都判断是否已经处理了最后一个属性子节点(判断方框408)。如果没有,则获取下一个属性子节点(方框402),并以类似的方式对其进行处理。如果子属性节点是所选择的堆栈条目中的表达式节点的最后一个属性子节点(判断方框408,“是”支线),则表达式处理器42可以判断是否已经处理了最后一个表达式节点(判断方框400),并可以转到下一个堆栈条目(方框410)或相应地终止处理。
如果所选择的堆栈条目的PrTP字段等于5,或者属性名称,那么,属性可以满足所选择的堆栈条目中的表达式节点的谓词是可能的。如此(判断方框396,“PrTP=5”支线),表达式处理器42可以将属性序列号与所选择的堆栈条目的PrDT字段进行比较(方框412)。如果属性匹配PrDT字段(判断方框414,“是”支线),则属性满足谓词,并且表达式处理器42将所选择的堆栈条目的eval字段设置为1(方框416)。不论是哪一种情况,表达式处理器42都可以转到下一个堆栈条目(方框410)。如果希望,表达式处理器42可以在前进之前判断是否有任何剩余表达式节点(判断方框400)。
值得注意的是,给定堆栈条目可以让eval字段等于0,让PrTP字段不等于5。在这样的情况下,表达式处理器42可以转到下一个堆栈条目(方框410)。
现在请参看图22A-22B,显示了一个流程图,该流程图说明了响应文本事件,使用图17所示的分析时表达式树26,表达式处理器42的一个实施例的操作。由文本事件标识的文本节点在图22A-22B的描述中被称为“文本节点”。一般而言,处理可以包括检查相对顶级表达式节点,以查看是否有文本节点的匹配,以及检查文本节点是否满足/和//堆栈39C和39D上的表达式节点的谓词,或者是这样的表达式节点的文本子节点。
如果文本节点的父节点是根节点(判断方框420,“是”支线),那么,不需要执行其他处理。另一方面,如果文本节点的父节点不是根节点(判断方框420,“否”支线),则表达式处理器42继续。
表达式处理器42可以检查每一个相对顶级表达式节点,以查找与文本节点的匹配(方框422)。如果存在与给定相对顶级表达式节点的匹配(判断方框424,“是”支线),则将文本节点输出到匹配列表39G(方框426)。不管是否存在匹配,都可以对下一相对顶级表达式节点继续处理,直到顶级表达式节点耗尽(判断方框428,“否”支线)。一旦耗尽了顶级表达式节点(判断方框428,“是”支线),处理在图24B中的参考点F处继续。
在图22B中的参考点F处继续,搜索/和//堆栈以查看文本节点是否匹配以前匹配的表达式节点的子或谓词(存储在/或//堆栈的其中一个条目中)。如果/和//堆栈是空的(判断方框430,“是”支线),则对于此文本节点,匹配结束。否则(判断方框430,“否”支线),选择一个堆栈条目。如果该条目中的eval字段被设置为1,则所选择的堆栈条目中的对应的表达式节点要么没有谓词,要么谓词已经被以前分析的文档节点满足。相应地(判断方框432,“eval=1”支线),表达式处理器42可以检查所选择的堆栈条目中的表达式节点的任何文本子节点,以判断文本节点是否匹配任何文本子节点。具体来说,如果表达式节点没有文本子节点(如所指出的,例如,在分析时表达式树条目300的CD字段中)(判断方框434,“否”支线),则表达式处理器42可以判断是否已经处理了堆栈中的最后一个表达式节点(判断方框446)。如果是(判断方框446,“是”支线),则对于文本节点,处理结束。否则(判断方框446,“否”支线),表达式处理器42可以转到下一个堆栈条目(方框448)以便进行处理。如果表达式节点具有文本子节点(判断方框434,“是”支线),则表达式处理器42获取表达式节点的第一文本子节点(方框436)。例如,该条目的Ptr/或Ptr//指针可以用来定位文本子节点(以及每一个子节点中的NT字段)。如果子文本节点匹配文本节点(方框438,“是”支线),则该节点被输出到匹配列表(方框440)。不管子文本节点是否匹配文本节点,表达式处理器42都判断是否已经处理了最后一个文本子节点(判断方框442)。如果没有,则获取下一个文本子节点(方框436),并以类似的方式对其进行处理。如果子文本节点是所选择的堆栈条目中的表达式节点的最后一个文本子节点(判断方框442,“是”支线),则表达式处理器42可以判断是否已经处理了最后一个表达式节点(判断方框446),并可以转到下一个堆栈条目(方框448)或相应地终止处理。
如果所选择的堆栈条目的PrTP字段等于8(节点测试)或者B(文本节点测试),那么,文本节点满足所选择的堆栈条目中的表达式节点的谓词(判断方框432,“PrTP=8或者B”支线)。如此,表达式处理器42将所选择的堆栈条目的eval字段设置为1(方框444)。表达式处理器42可以转到下一个堆栈条目(方框448)。如果希望,表达式处理器42可以在前进之前判断是否有任何剩余表达式节点(判断方框446)。
值得注意的是,给定堆栈条目可以让eval字段等于0,让PrTP字段不等于8或B。在这样的情况下,表达式处理器42可以转到下一个堆栈条目(方框448)。
现在请参看图23A-23B,显示了一个流程图,该流程图说明了响应注释事件,使用图17所示的分析时表达式树26,表达式处理器42的一个实施例的操作。由注释事件标识的注释节点在图23A-23B的描述中被简称为“注释节点”。一般而言,处理可以包括检查相对顶级表达式节点,以查看是否有注释节点的匹配,以及检查注释节点是否满足/和//堆栈39C和39D上的表达式节点的谓词,或者是这样的表达式节点的注释子节点。
如果注释节点的父节点是根节点(判断方框450,“是”支线),那么,不需要执行其他处理。另一方面,如果注释节点的父节点不是根节点(判断方框450,“否”支线),则表达式处理器42继续。
表达式处理器42可以检查每一个相对顶级表达式节点,以查找与注释节点的匹配(方框452)。如果存在与给定相对顶级表达式节点的匹配(判断方框454,“是”支线),则将注释节点输出到匹配列表39G(方框456)。不管是否存在匹配,都可以对下一相对顶级表达式节点继续处理,直到顶级表达式节点耗尽(判断方框458,“否”支线)。一旦耗尽了顶级表达式节点(判断方框458,“是”支线),处理在图23B中的参考点G处继续。
在图23B中的参考点G处继续,搜索/和//堆栈以查看注释节点是否匹配以前匹配的表达式节点的子或谓词(存储在/或//堆栈的其中一个条目中)。如果/和//堆栈是空的(判断方框460,“是”支线),则对于此注释节点,匹配结束。否则(判断方框460,“否”支线),选择一个堆栈条目。如果该条目中的eval字段被设置为1,则所选择的堆栈条目中的对应的表达式节点要么没有谓词,要么谓词已经被以前分析的文档节点满足。相应地(判断方框462,“eval=1”支线),表达式处理器42可以检查所选择的堆栈条目中的表达式节点的任何注释子节点,以判断注释节点是否匹配任何注释子节点。具体来说,如果所选择的条目中的表达式节点没有注释子节点(如所指出的,例如,在分析时表达式树条目300的CD字段中)(判断方框464,“否”支线),则表达式处理器42可以判断是否已经处理了堆栈中的最后一个表达式节点(判断方框476)。如果是(判断方框476,“是”支线),则对于注释节点,处理结束。否则(判断方框476,“否”支线),表达式处理器42可以转到下一个堆栈条目(方框478)以便进行处理。如果表达式节点具有注释子节点(判断方框464,“是”支线),则表达式处理器42获取表达式节点的第一注释子节点(方框456)。例如,该条目的Ptr/或Ptr//指针可以用来定位注释子节点(以及每一个子节点中的NT字段)。如果子注释节点匹配注释节点(方框468,“是”支线),则该节点被输出到匹配列表(方框470)。不管子注释节点是否匹配注释节点,表达式处理器42都判断是否已经处理了最后一个注释子节点(判断方框472)。如果没有,则获取下一个注释子节点(方框466),并以类似的方式对其进行处理。如果子注释节点是所选择的堆栈条目中的表达式节点的最后一个子注释(判断方框472,“是”支线),则表达式处理器42可以判断是否已经处理了最后一个表达式节点(判断方框476),并可以转到下一个堆栈条目(方框478)或相应地终止处理。
如果所选择的堆栈条目的PrTP字段等于8(节点测试)或者9(注释节点测试),那么,注释节点满足所选择的堆栈条目中的表达式节点的谓词(判断方框462,“PrTP=8或者9”支线)。如此,表达式处理器42将所选择的堆栈条目的eval字段设置为1(方框474)。表达式处理器42可以转到下一个堆栈条目(方框478)。如果希望,表达式处理器42可以在前进之前判断是否有任何剩余表达式节点(判断方框476)。
值得注意的是,给定堆栈条目可以让eval字段等于0,让PrTP字段不等于8或9。在这样的情况下,表达式处理器42可以转到下一个堆栈条目(方框478)。
现在请参看图24A-24B,显示了一个流程图,该流程图说明了响应处理指令事件,使用图17所示的分析时表达式树26,表达式处理器42的一个实施例的操作。在处理指令事件中标识的处理指令节点可以在图24A-24B的描述中被称为“处理指令节点”或“PI节点”。一般而言,处理可以包括检查相对顶级表达式节点,以查看是否有PI节点的匹配,以及检查PI节点是否满足/和//堆栈39C和39D上的表达式节点的谓词,或者是这样的表达式节点的PI子节点。
如果PI节点的父节点是根节点(判断方框480,“是”支线),那么,不需要执行其他处理。另一方面,如果PI节点的父节点不是根节点(判断方框480,“否”支线),则表达式处理器42继续。
表达式处理器42可以检查每一个相对顶级表达式节点,以查找与PI节点的匹配(方框482)。如果存在与给定相对顶级表达式节点的匹配(判断方框484,“是”支线),则将PI节点输出到匹配列表39G(方框486)。不管是否存在匹配,都可以对下一相对顶级表达式节点继续处理,直到顶级表达式节点耗尽(判断方框488,“否”支线)。一旦耗尽了顶级表达式节点(判断方框488,“是”支线),处理在图24B中的参考点H处继续。
在图24B中的参考点H处继续,搜索/和//堆栈以查看PI节点是否匹配以前匹配的表达式节点的子或谓词(存储在/或//堆栈的其中一个条目中)。如果/和//堆栈是空的(判断方框490,“是”支线),则对于此PI节点,匹配结束。否则(判断方框490,“否”支线),选择一个堆栈条目。如果该条目中的eval字段被设置为1,则所选择的堆栈条目中的对应的表达式节点要么没有谓词,要么谓词已经被以前分析的文档节点满足。相应地(判断方框492,“eval=1”支线),表达式处理器42可以检查所选择的堆栈条目中的表达式节点的任何PI子节点,以判断PI节点是否匹配任何PI子节点。具体来说,如果所选择的条目中的表达式节点没有PI子节点(如所指出的,例如,在分析时表达式树条目300的CD字段中)(判断方框494,“否”支线),则表达式处理器42可以判断是否已经处理了堆栈中的最后一个表达式节点(判断方框512)。如果是(判断方框512,“是”支线),则对于PI节点,处理结束。否则(判断方框512,“否”支线),表达式处理器42可以转到下一个堆栈条目(方框514)以便进行处理。如果所选择的条目中的表达式节点具有PI子节点(判断方框494,“是”支线),则表达式处理器42获取所选择的条目中的表达式节点的第一PI子节点(方框496)。例如,条目的Ptr/PI或Ptr//PI指针可以用来定位PI子节点。如果子PI节点匹配PI节点(方框498,“是”支线),则该节点被输出到匹配列表(方框500)。不管子PI节点是否匹配PI节点,表达式处理器42都判断是否已经处理了最后一个PI子节点(判断方框502)。如果没有,则获取下一个PI子节点(方框496),并以类似的方式对其进行处理。如果子PI节点是所选择的堆栈条目中的表达式节点的最后一个PI子节点(判断方框502,“是”支线),则表达式处理器42可以判断是否已经处理了最后一个表达式节点(判断方框512),并可以转到下一个堆栈条目(方框514)或相应地终止处理。
如果所选择的堆栈条目的PrTP字段等于8(节点测试)或者A(PI节点测试),那么,PI节点满足所选择的堆栈条目中的表达式节点的谓词。如此,表达式处理器42将所选择的堆栈条目的eval字段设置为1(方框510)。表达式处理器42可以转到下一个堆栈条目(方框514)。如果希望,表达式处理器42可以在前进之前判断是否有任何剩余表达式节点(判断方框512)。
如果所选择的堆栈条目的PrTP字段等于6(具有名称的PI节点测试),那么,如果PI节点的PITarget匹配PrDT字段,则PI节点满足谓词。表达式处理器42将PITarget与PrDT字段进行比较(方框506)。如果检测到匹配(判断方框508,“是”支线),则表达式处理器42将所选择的条目的eval字段设置为1(方框510)。表达式处理器42可以转到下一个堆栈条目(方框514)。如果希望,表达式处理器42可以在前进之前判断是否有任何剩余表达式节点(判断方框512)。
值得注意的是,给定堆栈条目可以让eval字段等于0,让PrTP字段不等于6、8或A。在这样的情况下,表达式处理器42可以转到下一个堆栈条目(方框514)。
值得注意的是,在一些实施例中,表达式处理器42可以被管道化。例如,节点的比较可以在比获取那些节点(以及对于具有谓词的节点,检查eval字段)稍后的流水线级进行。在这样的实施例中,/和//堆栈条目可以包括当流水线中存在对eval字段的潜在改变时可以设置的正在进行中的位。正在进行中的位,当设置时,可以指出条目忙着,以便在进行比较之前随后的事件不会读取eval字段。
值得注意的是,在上述各个点,表达式节点可以被称为被推到/堆栈39C或//堆栈39D中。将表达式节点推到堆栈39C-39D中的操作可以包括将节点的表达式树条目300推到堆栈中(或用于表达式匹配的表达式树条目的一部分)。依照要求,条目中可以包括补充信息(例如,指出匹配的进度的各种状态变量,如eval字段)。
一旦完全理解了上述说明书,对于那些精通本技术的人来说,很显然,可以有很多变化和修改方案。下面的权利要求应被解释为包括所有这样的变化和修改方案。
Claims (16)
1.一种用于对样式表中的表达式求值的装置,包括:
样式表编译器,该样式表编译器被配置为标识样式表中的表达式,并被配置为生成表示表达式的一个或多个表达式树,其中,具有一个或多个共同节点的表达式被表示为代表共同节点的子树的子;以及
连接为接收文档和表达式树的文档处理器,其中,文档处理器被配置为对照文档对一个或多个表达式树中表示的表达式进行求值,
其中所述样式表编译器还被配置为向节点标识符分配序列号,以及将分配的序列号与节点标识符的映射存储在一个或多个符号表中,所述节点标识符对应于一个或多个共同节点处的字符串。
2.根据权利要求1所述的装置,其中,文档处理器包括分析器和表达式处理器,其中,分析器被配置为对文档进行分析以标识节点,并且分析器被配置为将标识的节点的指示传递到表达式处理器,并且表达式处理器被配置为将标识的节点匹配到一个或多个表达式树。
3.根据权利要求2所述的装置,其中,文档处理器进一步包括转换引擎,该转换引擎被配置为在满足由表达式处理器标识的表达式的匹配节点上执行对应于每一个表达式的操作。
4.根据权利要求3所述的装置,其中,如果第一表达式的一部分不能在分析过程中被表达式处理器求值,则样式表编译器被配置为标识对应于该部分的分组,并且表达式处理器被配置为输出根据所述分组而被分组的匹配节点。
5.根据权利要求4所述的装置,其中,转换引擎被配置为对该部分进行求值,并从满足该部分的所述分组中选择节点。
6.根据权利要求2所述的装置,其中,分析器被配置为将标识的节点的指示内联地传递到表达式处理器,并且表达式处理器被配置为保留一个或多个表达式树中的已经被前面的节点匹配的一个或多个位置。
7.根据权利要求6所述的装置,其中,表达式处理器被配置为维护多个堆栈,表达式处理器向这些堆栈中存储一个或多个表达式树的已经被前面的节点匹配的节点。
8.根据权利要求7所述的装置,其中,一个或多个表达式树中的节点包括父/子引用和祖先/后代引用,并且多个堆栈包括用于父/子引用和祖先/后代引用的分开的堆栈。
9.一种用于对样式表中的表达式求值的方法,包括:
标识样式表中的表达式;
生成表示表达式的一个或多个表达式树,其中,具有一个或多个共同节点的表达式被表示为代表共同节点的子树的子;
向节点标识符分配序列号,所述节点标识符对应于一个或多个共同节点处的字符串;
将分配的序列号与节点标识符的映射存储在一个或多个符号表中;以及
对照文档对一个或多个表达式树中表示的表达式进行求值。
10.根据权利要求9所述的方法,进一步包括:
对文档进行分析以标识节点;
将标识的节点的指示传递到表达式处理器;以及
在表达式处理器中将标识的节点匹配到一个或多个表达式树。
11.根据权利要求10所述的方法,进一步包括在满足由表达式处理器标识的表达式的匹配节点上执行对应于每一个表达式的操作。
12.根据权利要求11所述的方法,进一步包括:
如果第一表达式的一部分不能在分析过程中被表达式处理器求值,则样式表编译器标识对应于该部分的分组;以及
表达式处理器输出根据所述分组而被分组的匹配节点。
13.根据权利要求12所述的方法,进一步包括:
对该部分进行求值;以及
从满足该部分的分组中选择节点。
14.根据权利要求10所述的方法,其中,标识的节点被内联地传递到表达式处理器,该方法进一步包括表达式处理器保留一个或多个表达式树中的已经被前面的节点匹配的一个或多个位置。
15.根据权利要求14所述的方法,其中,保留位置的操作包括表达式处理器维护多个堆栈,表达式处理器向这些堆栈中存储一个或多个表达式树的已经被前面的节点匹配的节点。
16.根据权利要求15所述的方法,其中,一个或多个表达式树中的节点包括父/子引用和祖先/后代引用,并且多个堆栈包括用于父/子引用和祖先/后代引用的分开的堆栈。
Applications Claiming Priority (5)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US51330603P | 2003-10-22 | 2003-10-22 | |
US60/513,306 | 2003-10-22 | ||
US10/889,273 | 2004-07-12 | ||
US10/889,273 US7437666B2 (en) | 2003-10-22 | 2004-07-12 | Expression grouping and evaluation |
PCT/US2004/035285 WO2005041072A1 (en) | 2003-10-22 | 2004-10-22 | Expression grouping and evaluation |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101416182A CN101416182A (zh) | 2009-04-22 |
CN101416182B true CN101416182B (zh) | 2010-12-08 |
Family
ID=37610227
Family Applications (3)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2004800345567A Expired - Fee Related CN100498770C (zh) | 2003-10-22 | 2004-10-22 | 进行高性能结构化数据转换的硬件/软件分区装置和方法 |
CN2004800347863A Expired - Fee Related CN1910576B (zh) | 2003-10-22 | 2004-10-22 | 用于结构化数据转换的设备 |
CN2004800345552A Expired - Fee Related CN101416182B (zh) | 2003-10-22 | 2004-10-22 | 表达式分组和求值 |
Family Applications Before (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2004800345567A Expired - Fee Related CN100498770C (zh) | 2003-10-22 | 2004-10-22 | 进行高性能结构化数据转换的硬件/软件分区装置和方法 |
CN2004800347863A Expired - Fee Related CN1910576B (zh) | 2003-10-22 | 2004-10-22 | 用于结构化数据转换的设备 |
Country Status (1)
Country | Link |
---|---|
CN (3) | CN100498770C (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8601438B2 (en) * | 2008-11-17 | 2013-12-03 | Accenture Global Services Limited | Data transformation based on a technical design document |
CN103186359B (zh) | 2011-12-30 | 2018-08-28 | 南京中兴软件有限责任公司 | 硬件抽象数据结构、数据处理方法及系统 |
CN108959235B (zh) | 2017-05-19 | 2021-10-19 | 北京庖丁科技有限公司 | 文字中获取表达式的方法和装置 |
CN114237577B (zh) * | 2022-02-24 | 2022-05-06 | 成都无糖信息技术有限公司 | 一种基于cel与ml实现图灵完备语言解析系统及解析方法 |
CN115830200B (zh) * | 2022-11-07 | 2023-05-12 | 北京力控元通科技有限公司 | 三维模型的生成方法、三维图形的渲染方法、装置及设备 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6263332B1 (en) * | 1998-08-14 | 2001-07-17 | Vignette Corporation | System and method for query processing of structured documents |
CN1414485A (zh) * | 2001-10-26 | 2003-04-30 | 日本电气株式会社 | 内容转换系统,自动样式表选择方法及其程序 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
BR9914427A (pt) * | 1998-10-16 | 2001-06-26 | Computer Ass Think Inc | Acesso a um armazenamento de dados hierárquicos através de uma entrada sql |
-
2004
- 2004-10-22 CN CNB2004800345567A patent/CN100498770C/zh not_active Expired - Fee Related
- 2004-10-22 CN CN2004800347863A patent/CN1910576B/zh not_active Expired - Fee Related
- 2004-10-22 CN CN2004800345552A patent/CN101416182B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6263332B1 (en) * | 1998-08-14 | 2001-07-17 | Vignette Corporation | System and method for query processing of structured documents |
CN1414485A (zh) * | 2001-10-26 | 2003-04-30 | 日本电气株式会社 | 内容转换系统,自动样式表选择方法及其程序 |
Non-Patent Citations (1)
Title |
---|
Charles Barton ET.AL..Streaming XPath Processing with Forward and Backward Axes.Proceedings of the 19th International Conference on Data Engineering,2003 IEEE.2003,455-466. * |
Also Published As
Publication number | Publication date |
---|---|
CN100498770C (zh) | 2009-06-10 |
CN101416182A (zh) | 2009-04-22 |
CN1910576B (zh) | 2010-11-03 |
CN1898666A (zh) | 2007-01-17 |
CN1910576A (zh) | 2007-02-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101930465B (zh) | 用于处理文档的方法 | |
KR101204128B1 (ko) | 고성능의 구조적 데이터 변환을 위한 하드웨어/소프트웨어파티션 | |
KR101129083B1 (ko) | 표현 그룹화 및 평가 | |
CN102375826B (zh) | Sql脚本解析方法、装置及系统 | |
CN1906609B (zh) | 在数据中心中使用的用于进行数据格式转换的系统 | |
US7912874B2 (en) | Apparatus and system for defining a metadata schema to facilitate passing data between an extensible markup language document and a hierarchical database | |
CN110134671B (zh) | 一种面向溯源应用的区块链数据库数据管理系统及方法 | |
US7461044B2 (en) | It resource event situation classification and semantics | |
US6243859B1 (en) | Method of edit program codes by in time extracting and storing | |
US20040103087A1 (en) | Method and apparatus for combining multiple search workers | |
JP2001167087A (ja) | 構造化文書検索装置,構造化文書検索方法,構造化文書検索用プログラム記録媒体および構造化文書検索用インデックス作成方法 | |
US7519948B1 (en) | Platform for processing semi-structured self-describing data | |
CN101416182B (zh) | 表达式分组和求值 | |
KR101827965B1 (ko) | 연동 통제 문서 분석 장치 및 방법 | |
WO2014051455A1 (en) | Method and system for storing graph data | |
CN115407978A (zh) | 一种面向Java框架的跨语言名称绑定方法 | |
JP3882835B2 (ja) | データベース管理方法および並列データベース管理システム | |
Pelloni | Parsing Information from PDF Papers to Match With EUREKA Addresses |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20101208 Termination date: 20181022 |