可扩展标记语言流化转换器的制作方法

文档序号:6418172阅读:152来源:国知局

专利名称::可扩展标记语言流化转换器的制作方法
技术领域
:本发明涉及用于文档的固定和非常低的存储器使用量转换的系统和方法,其中该文档被当作离散处理事件的流,而不需要将要构造的所有元素之间的分级关系的表示(representation),也不需要横跨文档的这种分级对象表示来完成转换。本发明尤其涉及用于转换XML文档的系统和协议。
背景技术
:商业机构-商业机构(B2B)和应用-应用(A2A)电子商务正在取代以前用于电子数据交换(EDI)的协议。由于商业机构致力于使用B2B和A2A系统来改善其效率,涌现了许多不兼容的平台和竞争的标准。一种已经被证实的需要是转换XML文档,典型地将文档从一个系统转换到另一个系统。使用转换的另一个原因是标准可能具有几种版本,并且一端使用旧的版本而另一端使用更新的版本。由于必须应用来产生内嵌标记(inlinemarkup)的严格的规则使计算机程序分析并处理文本文档的内容相对简单,所以XML已经成为广泛使用的数据类型。例如,可以由知道怎样读取用于描述正要购买的物品、购买者等等的标记注释的订单输入(entry)应用软件处理以XML写成的购买订单。因此,使用转换的第三个原因是在购买订单中采集信息并用其产生诸如包含购买者、正在购买的物品和从第一文档复制来的其他信息的交货清单之类的应答文档。转换是计算机处理的主要范畴。用于大型商场的商业交易的无纸系统每天可能需要数以千计的XML文档的转换。XML文档通常很大,具有数以千计必须要在转换中处理的单独的数据元素。表示从输入到输出的转换的规则也可能是十分广泛的。完成单独的转换所需的应答时间可能非常长,并且对用于支持企业级转换服务的计算机资源的需求也可能快速增长到不可接受的比例。虽然存在许多用于完成XML转换的不同工具,但是缺少有效设计来处理性能问题的工具。现今使用的最受欢迎的工具XSLT通过需要非常消耗计算机资源的内部数据模型而使性能问题变得更加严重。已经做了一些尝试来通过将XSLT转换语句编译成诸如Java之类的更有效的编程语言或通过超高速缓存模式来缓和这些问题。这些途径没有改变导致效率低下的基本处理。因此,有必要设计一种有效指定(specify)并实现XML文档转换的方法和结构。
发明内容本发明涉及文档固定和非常低存储器使用转换的系统和方法,其中该文档被当作离散处理事件的流,而不需要将要构造的所有元素之间的分级关系的表示(representation),也不需要横跨文档的这种分级对象表示来完成转换。在权利要求、说明书和附图中描述了本发明的详细内容。图1是转换处理的高级方框图;图2也是描述输入事件和结束事件的分离处理的高级方框图;图3是XST转换引擎的高级方框图;图4到图6提供在图3中出现的元素的额外细节;图7到9是在一个实施例中用于处理事件流中的事件的流程图。图10是处理可以用于一个实施例的、依靠模式附件结构的查找的流程图;图11和12描述使用不同的SAX分析器的另一个实现;图13是模板处理的高级方框图;图14是跟在模板处理后的XML实例处理的高级方框图;图15A-C是XST实施例的模式。具体实施例方式将参考附图进行详细描述。描述优选实施例来说明本发明,而不是限制其由权利要求定义的范围。本领域技术人员将认识到与下面描述等效各种变化形式。XST是一种转换技术。转换是使用一系列描述变更的确定性规则将输入源改转变为输出的变更。在一个实施例中,XST对以XML或相似结构和标签的标记语言标记的源数据进行操作。由遵守XML句法规则的内嵌标记来注释XML数据。XST转换的输出是文本数据,也可以是XML文档。由包含在模板中的一系列规则描述XST转换。这些规则以一种语言表达。转换语言类似于通用程序语言,但仅提供描述将合法输入转换为合法输出所需的转换所用到的表达方式(expressiveness)。当合法输入限于XML或相似结构和标签的文档时,与一般转换相比问题空间是非常有限的。因此对于程序员来说是更容易写转换,并且用于计算描述在模板中的转换的处理器的实现是一件更容易的工作。在发生转换操作的情况下,模板在源文档的后续处理中定义重要的输入事件。在一个实施例中,输入事件定义和相关转换操作可以称为子模板。在子模板级,发生针对输出的流。下面有大量的例子。即使在XML转换的有限范围中,也可以设计针对转换语言的许多不同方式。最常用的语言类型(以XSLT为代表)是将XML输入文档作为节点树操作的语言。对于XML文档,这提供一种一般被认为是直观的方式来描述转换,并且提供广泛的表达方式使转换程序员相对容易地表达几乎任何转换处理。关于这种语言类型的问题是其迫使底层实现实际上将整个XML文档转换为节点树,并且执行由转换所需的操作作为基于树的节点操作。特别地,如果需要在节点之间的许多回溯(backtracking),则将XML文档转换为树是代价极高的操作,并且对树后续操作也是高代价的。典型地,在存储器中将整个XML文档转换为树,并且与其字节流相比该树占据了几倍的文档大小。可能存在用于降低存储树所需的存储器容量的各种优化,但它们是相当难实现的。此外,这些优化可能需要更好的存储器使用与更慢的性能之间的折衷。由于这些和其他的原因,面向树型转换语言的底层实现在树表示或树大小方面不是最优的。XST转换语言是一种被有意限制来实现更有效的转换处理的底层实现。在研究数百种现有转换后,发现它们中大部分不需要完全基于树的语言的表达方式。XST使用更简单的范例用于其基本的、默认的处理,并且仅仅在需要时使用更为复杂和高代价的结构用于XML文档的特定片断。XST方式还认可对于转换的特定类,可能很难写出模板并且性能也不优于基于树的语言。因此,对于可以以更受限制的语言(idiom)表达的大量转换来说,XST可以提供高性能。为了处理XML输入流,扫描流以便识别内嵌标记以及由内嵌标记注释的内容。标记和内容的识别产生所谓的“事件”,该处理有时称为“事件流分析”。此外,需要更复杂的处理来形成用于从这些事件中获取内容项之间的分级关系的节点树。在约束环境中,甚至在一次通过XML文档情况下,XST也可以处理形成节点树的事件流。单次通过、非树型处理可以使用相对小的缓冲器,从而保持很小的存储器使用。因为时间没有花费在构造树或多次通过树来处理转换上,虽然缓冲器小,但处理时间可能更快。针对XML文档转换的事件流分析的应用是创新的。XST语言被谨慎地设计来使用事件流分析方法实现大量(bulk)转换处理。XST的几个方面将事件流分析扩展到大量转换问题上。可变变量可以在事件流处理中用作来自先前事件的前向参考信息,并且计算上下文特定值。可以将输出流的各部分分离并定向到多个输出目标。可以从事件中调用Java方法和其他外部处理程序。在某些实施例中,通过允许在文档的片断或子部分上构造树,XST使将基于树节点的处理混合为事件流处理成为可能。XST还在主XST转换事件处理器之前或之后将额外的事件处理器链接在一起。图1是事件处理的高级方框图。在这里描述的事件处理对指定模板元素进行操作,根据任何文档的逻辑结构转换最好是以XML表示的电子商务文档,但是通常包括包含编码文本字符的字符数据和标识存储单元组的标记数据的文档。在下面图解或描述了许多以各种组合使用的选项。分析器产生对应于电子商务源的事件流101,其可以是文件或任何数据点或数据流。在计算机中驻留的软件用于接收由对应于电子商务源的分析器产生的事件102。在某些实施例中,事件包括元素开始事件103、输入事件和元素结束事件105。在其他实施例中,分析器可以传递权标(token),并且系统可以用于从权标中产生事件。在其他实施例中,可以接收和分析字符流以产生权标或事件。响应元素开始事件103,计算机辅助系统使元素与指定模板104匹配。这可以通过使作为元素开始事件的一部分传递的元素名与元素模板的对应名称匹配来完成。如其他附图中所示,多个模板实例可以存储在存储器中的树中。或者,模板实例可以存储在另一种数据结构中,例如可以由XML的简单API(SAX)访问的结构。在某些实施例中,多个模板实例一起存储在模板源中。在不存在匹配的情况下,由开始事件表示的元素被当作其父元素的内容。XST转换应该包括匹配电子商务文档的根元素的模板元素。在这样的约束下,不存在匹配模板的子元素可以被看作是其父元素的内容。元素的内容可以包括出现在触发元素开始事件的权标和触发元素结束事件的权标之间的所有数据。内容可以或不可以包括嵌套子元素。内容可以或不可以包括例如XML形成的元素的属性的元素属性。在由元素开始事件表示的元素与模板源中的指定模板或子模板匹配的情况下,系统激活指定模板。当处理达到元素结束事件105时,系统尝试将元素与对应激活的指定模板匹配。在与对应激活的指定模板匹配的情况下,在106执行处理。处理可以包括来自模板的文字文本和来自流的输入事件的输出。响应激活的模板中的指令,系统从对应于当前元素的输入事件中输出文字文本或内容。在处理了当前元素的内容之后,系统可以从例如输入缓冲器中清除输入事件。激活的指定模板可以去激活。通过使用具有模板的可变变量可以增强本发明实施例。为文档的处理可以激活变量,或者可以将变量限于处理指定模板(包括任何嵌套的指定模板)的范围中。对元素开始事件的应答可以包括激活一个或多个变量;对对应的结束事件的应答可以包括去激活变量。输入流值可以赋予可变变量或没有命名的、非可变变量上。使用子字符串、级联或其他操作符可以改变可变变量。处理结束事件和对应的模板可以包括操作变量。可以由诸如Java方法之类的外部处理程序操作变量。通过使用模板中的控制操作符的流程可以进一步增强该实施例。控制操作符的流程可以像“if”和“choose”那样简单。它们可以进一步包括“foreach”、“when”和“otherwise”操作符。还可以使用诸如“else”和“then-else”等的结构。某些控制操作符的流程对被转换为树结构的输入文档的片断和子部分进行操作。图2是事件处理的另一个方框图。该事件处理还对指定模板元素进行操作。由从系统分离的分析器或系统的部件产生事件流101。处理模块接收事件流102。在104其如上所述那样匹配开始事件103。响应匹配,系统可以建立一个或多个变量来存储内容、属性或对应于元素的标签。根据模板元素的结构,变量具有局部和全局范围。当变量具有局部范围时,只要对应的指定模板有效它们就有效。当变量具有全局范围时,它们在整个文档转换中是有效的。系统通常通过上述输出处理106处理结束事件105。除处理来自模板的文字文本和来自流的输入事件外,处理还可以包括操作变量,包括将输入流的各部分赋予变量并且实行对变量执行逻辑、字符串、算术或其它运算。不论操作与否,都可以输出变量的内容。处理还可以包括上述的控制指令的流程和外部处理的调用。外部处理可以包括以下将要进一步描述的Java类和方法。在第一实施例中,XST模板语言支持下列三个处理指令<xsttemplate>是XST模板的打开标记,并用于在一个文件中存储多个模板。<xstpi>是XST处理指令的打开标记。<xstvar>是XST变量的打开标记。在另一个实施例中,处理指令被当作模板的属性处理,并且将“模板”标记作为父类提供给“模板”标记的多个实例。XST模板是包括字符串文字和模板变量的文本文件。变量具有使用打开标记<xstvar>和关闭标记</xstvar>的格式<xstvar>变量名</xstvar>。变量提供模板和其对应的源XML文档之间的连接(binding)。转换始于分析XML文档。当XML文档具有根元素时,XST转换具有根模板。如果元素名是根,则模板命名为将根元素名称与扩展名“.tpl”组合起来的root.tpl,其中根是某种任意的元素的名称。通过XML文档中的其父元素,子模板可以附加到父模板。在另一个实施例中,XST转换引擎可以以流或缓冲的模式操作。与模板相似,转换的中间输出包括字符串文字和模板变量。在流模式中,当去激活或卸载模板时,流化每个模板的所传递的输出。在缓冲模式中,输出转换的结果,而在转换结束或父模板去激活时清除中间存储器的内容。在每个模板中,输出中的元素次序可以与输入文档中的元素次序不同。通过设计,XST转换重复使用加载的模板。在一个实施例中,用于XML的加载模板的列表存储在该文档的根模板的名称下。在存储器中存储所有列表以便快速访问。实际上,为了最小化存储器的使用量,引擎将转换的结果写到目标输出流上。对应于XML文档的XST转换包括一个或更多对应于XML文档的元素的模板。多个模板可以存储在一个文件中。XML文档的元素名和模板名的单独比较确定是否存在应该在转换期间被激活或加载的匹配模板。模板名可以由名称空间名限定。XST转换引擎提供公共接口以使用默认或用户所选的XML分析器/读取器来转换XML文档。其还支持用于XML分析(JAXP)接口的JavaAPI。引擎作为单独服务或其它服务的一部分运行。如图3所示,XST转换引擎302的第一实施例包括模板转换器303、源文档处理器305和模板处理器306模块。模板转换器303提供公共接口来使用XST转换XML文档。源文档处理器305注册为内容处理器来从XML读取器/分析器301接收各种SAX事件,并且将它们传送到模板处理器305。模板处理器306处理来自XML分析器301的SAX事件。其还提供装置来缓冲/重复使用加载的模板,并且使用在模式附件框架(SAF)307中指定的规则查找元素值。如图4所示,模板转换器402提供下列公共接口401、403来(1)使用默认或用户所选的XML读取器/分析器转换XML文档;(2)获得可以与其他XML读取器/适配器一同使用来处理SAX事件的内容处理器;(3)设置输出流;和(4)获得转换的输出文档。如图5所示,文档处理器502提供公共接口来(1)获得输出文档;(2)设置输出目标流;(3)获得在堆栈中的当前所使用的模板的列表;和(4)将在堆栈中的一列模板拿来使用。其还提供仅将事件传送到其模板处理器的SAX事件处理器501的接口。如图6所示,除了设置/获得由文档处理器502提供的接口,模板处理器602还提供方法getProperty()603来使用SAF查找属性。已经为XST转换603提供了SAX事件处理器601的五个实例。处理器startDocument()调用方法reset()来重置模板处理器的某些实例变量的状态。保留处理器endDocument。图7-9分别图示了由SAX处理器产生并由SAX事件处理器处理的、关于startElement、字符或输入和endElement事件的处理流程。图7描述startElement模块中的流程。在该实施例中,以可以表示诸如遵从文档类型定义(DTD)的数据类型、XML数据缩减(XDR)、XML文档内容描述(DCD)、面向对象XML模式(SOX)、文档定义标记语言(DDML)、XML模式、XML正规语言描述(RELAX/Core/NG)、XML树型正规表达(TREX)或模式之类的抽象数据类型的参数,调用startElement模块。在步骤702,测试输入来确定是否加载模式和模板。步骤705包括获得模板和模式。对于特定的抽象数据类型,产生并且可以查询抽象树。在步骤706的逻辑分支依赖于是否已经初始化了根元素。如果是这样,则在步骤708将正在打开的模板附加到其父模板上。如果不是这样,则正在打开的模板是根模板,并且在步骤707设置旗标(flag)。在步骤709,新激活的模板被推入模板堆栈。在可以从步骤709或703到达的步骤710中,处理元素的属性。当使用XML编码元素时,属性是XML属性。一旦完成属性处理,程序就返回。再次在步骤702,如果正在处理的元素不对应于指定模板,则下一个决定分支703确定最新激活的模板是否设置为复制对应元素的内容。在此,子元素被当作其父元素的内容。如果设置了复制,则在返回步骤712之前,处理前进到建立复制的步骤704,并前进到复制当调用startElement方法时通过的属性的步骤711。如果模板没有设置成复制内容,则对应于当前元素的输入流不复制到输出。从703到712,方法返回。图8描述处理输入流801的模块中的流程。在该实施例中,第一逻辑分支802使用lookup()方法来确定模式附件框架是否应用来处理该输入流。必须有可应用的模式附件框架并且其必须为可访问的(<>空)。如果模式附件框架是可应用并且是有效的,则在803应用。下一个处理分支确定是否存在与当前元素名称相同的变量。如果存在关于当前元素的变量,则在步骤808返回之前,在806调用设置的变量方法来将所有或部分输入流转换为变量。如果不存在对于当前元素的变量,则逻辑分支805确定是否已经调用复制指令或属性。如果是这样,则在807调用copy()方法。如果不是这样,则方法在808返回。通过少量调整,可以将暂时缓冲的输入事件流的处理延迟直到元素结束事件。图9描述处理结束元素事件901的模块中的流程。第一逻辑分支902将当前激活的模板与正在结束的事件相匹配。这可以通过将作为属性传送到方法的名称与当前模板名匹配来实现。虽然可以选择任何扩展名,在流程图中,所描述的方式将扩展名“.TPL”与当前元素的名称连接,并且与当前模板匹配。在基于前向处理输入事件的实施例中,缺少匹配导致方法在906返回。在将暂时缓冲的输入事件流的处理延迟直到元素结束事件的实施例中,即使对于元素结束事件来说没有任何匹配,也可以执行诸如元素的部分内容复制之类的某些处理。在匹配的情况中,在将模板存储在堆栈的实施例中,从堆栈中弹出当前模板用于在903处理。下一个逻辑分支904确定复制指令或属性是否是有效的。如果是有效的,缓冲器可以被输出并且清除。然后处理前进到情况904或905,并且在906方法返回。图10是使用模式附件框架的XST第一实施例中的处理流程的方框图。在该XST的实施例中已经集成了通用框架模式附件框架,来允许用户指定关于将要被转换的XML文档的属性或结构的额外信息。模式附件是包含与特定模式相关的额外的特定应用或特定域数据。关于SAF技术的额外信息出现在文章Vorthmann,S.etal.,“TheSchemaAdjunctFramework”,www.Extensibility.com/resources/saf_dec2000.htm中。模板处理器1001处理事件流中的特定事件,通常对应于图8步骤803中的lookup()方法。对于特定的元素,逻辑分支1002确定是否需要SAF查找。如果不需要,方法在1008返回。如果需要,则下一个逻辑分支1003确定所需的框架是不是可以访问的。如果不是,方法在1008返回。在一个实施例中,模式附件框架调用Java应用。在1004,模板处理器获得类名和方法名,然后在1005获得类实例和类方法。如果在1006类方法不是空的,则其在1007被调用。调用类方法可以包括调用XST外部的服务。在已经调用了类方法并返回后,在1008,模板处理器返回。下列例子说明使用SAF来向XML文档的元素<RefDate>的内容提供当前日期和时间。Java类被用于这种扩展。<schema-adjuncttarget=″...″><document><param-list>BuyerChangeOrderNumber;ChangeOrderIssueDate;RefNumber</param-list></document>......<elementwhich=″RefDate″><class>test.xst.templates.InfoRetriever</class><method>getDateTime</method></element>......</schema-adjunct>在上面的例子中,元素<param-list>的内容指定将要由XST存储到散列表(hashtable)中的一列叶元素;RefDate对应于源XML文档的元素名;test.xst.templates.InfoRetriever是提供模式附件扩展的Java类名;并且getDateTime是所调用的这种类的方法名。<param-list>使SA扩展能够从源XML文档访问已经由XST处理的元素。在下面显示了Java类的样品码,用于为元素<RefDate>提供更新的信息。/**FileNameInfoReTRiever.java*/packagetest.templates;importjava.util.Hashtable;importjava.util.Date;importjava.util.Properties;importcom.commerceone.xst.utils.PropertyReader;publicclassInfoRetriever{privatePropertiesprops;publicInfoRetriever(){this.props=PropertyReader.getProperties(PROP_FILE)}......publicStringgetDateTime(StringlocalName,Stringvalue,Hashtableht,Stringevent){return(newDate()).toString();}staticprivateintcnt=0;staticprivateStringPROPFILE=″test/templates/DefaultInfo.prop″;}如以上样品代码所示,提供SAF扩展的方法可以具有四参数(argument),其中在转换中localName和value对应于原始XML文档的元素的名称和值;ht是用于存储一列由SAF文档中的元素<param-list>的内容指定的叶元素的散列表;和event是当调用方法时的SAX事件名。应当说明的是,不在样品代码中使用传送到该方法的自变量。当启动查找时,由XST调用上述方法来向经受转换的元素<RefDate>提供额外的信息。下面的例子显示具有元素<RefDate>的源文档的样品ChangeOrder.xml。<?soxtypeurnx-commerceonedocumentcomcommerceoneXCBL35XCBL35.sox$1.0?><ChangeOrder><ChangeOrderHeader><ChangeOrderNumber><BuyerChangeOrderNumber>4500006637</BuyerChangeOrderNumber></ChangeOrderNumber><ChangeOrderSequence/><ChangeOrderIssueDate>20010521T12:00:00</ChangeOrderIssueDate><OrderReference><Reference><RefNum>4500006637</RefNum><RefDate>20010521T15:27:17</RefDate></Reference></OrderReference><SellerParty>......</ChangeOrderHeader>......</ChangeOrder>利用SAF扩展处理中的大多数逻辑,使用简单模板来转换ChangeOrder元素<xsttemplates><xstpi>NAME=ChangeOrder.tpl;COPY=true</xstpi></xsttemplate>使用以上显示的模板和SAF文档以及Java类,并且在2001年9月21日在15点27分17秒时运行XST,产生下列转换文档<?soxtypeurnx-commerceonedocumentcomcommerceoneXCBL35XCBL35.sox$1.0?><ChangeOrder><ChangeOrderHeader><ChangeOrderNumber><BuyerChangeOrderNumber>4500006637</BuyerChangeOrderNumber></ChangeOrderNumber><ChangeOrderSequence/><ChangeOrderIssueDate>20010521T12:00:00</ChangeOrderIssueDate><OrderReference><Reference><RefNum>4500006637</RefNum><RefDate>20010921T15:27:17</RefDate></Reference></OrderReference><SellerParty>......</ChangeOrderHeader>......</ChangeOrder>在经过转换的该文档中,元素<RefDate>具有由JavaSA扩展提供的、更新的日期/时间。下面的例子说明了怎样使用SAF来将额外的信息提供到XML文档的字段“address1”。Java类被用于这种扩展。<schema-adjuncttarget=″po.dtd″>......<elementwhich=″address1″><class>test.xst.templates.AddressRetriever</class><method>getAdditionalAddressInfo</method><mode>replace</mode></element>......</schema-adjunct>其中“address1”是原始XML文档中要被转换/修改的字段;“test.xst.templates.AddressRetriever”是Java类名;“getAddtionalAddressInfo”是将要调用的这种类的方法名;和“replace”是对返回的值的操作模式。使用的Java类的样品代码显示如下packagetest.xst.templates;publicclassAddressRetriever{publicAddressRetriever(){}publicStringgetNewAddressInfo(StringlocalName,Stringvalue,Hashtableparams){return″Thenewaddressis″+localName+″=″+value;}publicStringgetAdditionalAddressInfo(StringlocalName,Stringvalue,Hashtableparams){return″!!Additionaladdressinfofor″+localName+″.Theoriginalvalueis″+value+″.″;}}该方法的签名可以具有三参数“StringlocalName”、“Stringvalue”和“Hashtableparams”。其中“localName”和“value”对应于原始XML文档中经转换的字段的名称和值;和“Hashtableparams”是用于存储一列在模式附件文档中指定的名称和其在XML文档中的有效值的“散列表”。当启动查找时,由XST调用上面的方法来向经受转换的XML文档提供额外的信息。XST转换引擎使用诸如Xerces之类的默认XML分析器或用户选择的分析器提供接口来转换XML文档。在图11和12中,使用两个可供选择的分析器来产生事件流。在该环境下说明的特定分析器是XML分析器。分析器是默认的CommerceOneXML分析器1101和Xerces/Xalan分析器1201。说明了用于调用这些分析器的样品句法和语义。在任一情况中,分析器的输出被输入到XST转换引擎1102。XST转换引擎包括模板转换器1103、源文档处理器1104和模板处理器1105。对于模板源和文档源,在图13和14中说明了这些部件之间的交互的更多细节。在第二个实施例中,高级设计支持额外的特性。使用具有与XSLT页面格式文档的句法相似的XST模板。用于转换的所有模板驻留在一个模板源中,或通过引用包括在模板源中。可以通过公共接口或API添加额外的模板。可以由使用XPath表示或树操作访问的树结构表示源文档的片断或子部分。在XST模板中支持if、choose、when和otherwise逻辑操作。内建的函数为字符串、子字符串、连接功能提供。可以安装Java扩展函数处理器来处理用户定义的扩展函数。处理器通过指定Java方法的类路径和方法名支持调用Java方法。从输入流中接受值的变量在转换期间是可变的。在另一个实施例中,可以混合并且匹配第一和第二实施例的特性。如图13-14所述,第二实施例的高级结构与第一实施例类似。图13是显示分析XST模板源的处理流程的图表。图14是显示转换XML实例的处理流程的图表。在附图中,转换器模块1303通过诸如CommerceOneCXP分析器或Xerces分析器之类的XML分析器1304提供方便的方式来使用XST。其还提供接口来获得内容处理器的新实例和使用的模板列表。处理器模块1305为模板和源文档1301提供内容处理器。这些处理器可以与最好是遵从W3C标准的分析器的XML分析器一起使用。分析器将SAX分析事件发送到XST处理器1306用于进一步的处理。处理器模块1306提供模板处理器来将XST模板1301处理为DOM元素树1407,并提供源文档处理器来使用模板元素1408转换XML实例1401。XST模板1401是提供转换规则的有效XML文档。转换模块包括用于模板中每个元素的类。其还提供装置来流化并克隆模板。模块Xpath(未示出)提供适配器类来使用并执行由XPath引擎实现的XPath表示。返回到第一实施例,文档处理器1305的公共接口提供几种方法调用。getOutputDocument方法可以声明为XST模板getOutDocument()。该方法返回在转换中使用的根元素模板。getOutputDocument()方法可以声明为publicjava.io.OutputStreamgetOutputStream()。该方法返回在该转换中使用的目标输出流。getContentHandler方法可以声明为publicorg.xml.sax.ContentHandlergetContentHandler()。该方法返回该处理器的ContentHandler。getTemplate方法可以声明为publicjava.util.HashtablegetTemplates()。该方法获得当前模板列表。putTemplates方法可以声明为publicvoidputTemplates(java.util.HashtabletempList)。该方法将一列模板放入当前或激活的模板列表中。setOutputStream方法可以声明为publicvoidsetOutputStream(java.io.OutputStreamos)。该方法为该转换设置输出流。setSiblingContentHandler方法可以声明为publicvoidsetSiblingContentHandler(org.xml.sax.ContentHandlerhanlder)。该方法将同属(sibling)处理器放入同属列表的末尾。用于文档处理器的公共接口扩展模板处理器。其还包括几种方法。其从SAX适应(compliant)模板处理器继承包括characters、comment、endDocment、endElment、processingInstruciton、pushElement、pushTemplate、statDocument和startElement的方法。此外,文档处理器接口的getOutputStream方法可以声明为publicjava.io.OuputStreamgetOutputStream()。该方法获得由该处理器使用的输出流。对于流模式转换该对象不能为空。getDOMByRootName方法可以声明为publicorg.w3c.dom.NodegetDOMByRootName(java.lang.string.name)。该方法检索给定名称的DOM对象。getOutputTemplate方法可以声明为publicXSTtemplategetOutputTemplate()。该方法获得作为该转换的根模板的输出模板。getSchemaPath方法可以声明为publicjava.lang.String.getSchemaPath()。该方法获得用于模式附件文档的模式路径。getTemplatePath方法可以声明为publicjava.lang.String.getTemplatePath()。该方法获得模板路径。getTemplate方法可以声明为publicjava.util.HashtablegetTemplate()。该方法获得当前模板列表。getXPathContext方法可以声明为publicorg.apache.xpath.XPathContextgetXPathContext。该方法获得XPath运行上下文,其应该包括源文档树中的上下文节点。Lookup方法可以声明为publicjava.lang.Sttinglookup(java.lang.Stringkey,java.lang.Stringvalue,java.util.Hashtableht,java.lang.Stringmethod,java.lang.Stringevent,XSTtemplatetempl)。该方法使用指定方法查找给定节点的值。在其参数列表中localName是上下文节点的名称,其还是第一选择的名称;value是上下文节点的值;ht是用于存储在模板中指定的参数的值的散列表;method是用于查找的方法名;event是当调用该方法时的SAX事件;和templ是上下文节点的模板。该方法返回给定上下文节点的值。putTemplates方法可以声明为publicvoidputTemplates(java.util.HashtabletempList)。该方法将一列模板添加到当前模板列表中。setOutputStream方法可以声明为publicvoidsetOutputStream(java.io.OutputStreamos)。该方法设置该处理器的OutputStream(输出流),用于流模式转换。setSchemaPath方法可以声明为publicvoidsetSchemaPath(java.lang.Stringpath)。该方法设置用于模式附件文档的模式路径。setTemplatePath方法可以声明为publicvoidsetTemplatePath(java.lang.Stringpath)。该方法设置模式路径。TemplateProcessor(模板处理器)的公共接口包括几种方法。getTemplates方法可以声明为publicjava.util.HashtablegetTemplates()。该方法获得当前模板列表。pushElement方法可以声明为publicvoidpushElement(java.lang.Objectelem)。这种方法将元素推入元素堆栈。pushTemplate方法可以声明为publicvoidpushTemplate(java.lang.Stringname,java.lang.Objecttempl)。这种方法当名称是将要推入的对象的名称并且templ是将要推入的模板的对象时,将模板推入模板堆栈。characters方法可以声明为publicvoidcharacters(char[]ch,intstart,intlength)throwsorg.xml.sax.SAXException。这是用于字符和输入的SAX事件处理器接口。在其参数列表中ch是包含当前元素的值的字符数组;start是用于当前元素值的字符数组中的第一字符的索引;和length是用于当前元素值的字符数量。endDocument方法可以声明为publicvoidendElement(java.lang.String.namespace,java.lang.StringlocalName,java.lang.StringrawName),throwsorg.xml.sax.SAXException。这是用于endElement的SAX事件处理器接口。在其参数列表中localName是没有前缀的当前元素的节点名;和rawName是当前元素的限定名(具有前缀)。startDocument方法可以声明为publicvoidstartDocument()throwsorg.xml.sax.SAXException。这是用于startDocument的SAX事件处理器接口。startElement方法可以声明为publicvoidstartElement(java.lang.Stringnamespace,java.lang.StringlocalName,java.lang.StringrawName,org.xml.sax.Attributesatts)throwsorg.xml.sax.SAXException,javax.xml.transform.ThansformationException,java.io.IOException。SAX事件处理器接口startElement。在其参数列表中namespace是当前元素的名称空间;localName是当前元素(没有前缀)的限定名的本地部分;rawName是当前元素(具有前缀)的限定名;和attributes是与当前元素相关的属性列表。processingInstruction方法可以声明为publicvoidprocessingInstruction(java.lang.Stringtarget,java.lang.Stringdata)throwsorg.xml.sax.SAXException。这是用于processingInstruction的SAX事件处理器。在其参数列表中target是处理指令目标;和data是处理指令数据,或如果没有提供任何事物的情况下是空。该方法放弃可以是包含另一个例外的SAX例外的任何org.xml.sax.SAXException。支持注释。公共接口XSTElement支持XST转换语言的元素。在第一和第二实施例之间该接口的详细内容不同。第一实施例包括几种方法。appendChild方法可以声明为publicvoidappendChild(XSTElementelem)。该方法将子元素附加到该元素上。appendAndPushChild方法可以声明为publicvoidappendAndPushChild(XSTElementelem)。该方法将子元素附加到该元素并且将子元素推入其处理器的元素堆栈。appendContent方法可以声明为publicvoidappendContent(java.lang.Objectcontent)。该方法将对象的内容附加到该元素的内容。attachChild方法可以声明为publicvoidattachChild(XSTElementelem)。即使其可能不是直接子元素,该方法也将子元素加到该元素。Clone方法可以声明为publicjava.lang.Objectclone()。该方法克隆该元素并且返回复本。cloneAll方法可以声明为publicXSElementcloneAll()。该方法克隆该元素并包含其所有子元素。execute方法可以声明为publicjava.lang.Objectexcute()。该方法是元素转换的入口。其返回元素转换的结果。execute方法可以声明为publicvoidexcute(java.io.OutputStreamos)throwsjava.io.IOException。该方法执行该元素的转换并且将结果发送到OutputStream(输出流)。getAttribute方法可以声明为publicjava.lang.StringgetAttribute(java.lang.Stringqname)。该方法检索给定名称的属性的内容。getChild方法可以声明为publicXSTElementgetChild()。该方法获得该元素的第一子元素。getContent方法可以声明为publicjava.lang.getContent()。该方法获得该元素的内容。getElementName方法可以声明为publicjava.lang.StringgetElementName()。该方法获得该元素的属性名。getName方法可以声明为publicjava.lang.StringgetName()。该方法获得该元素的名称。getNamespace方法可以声明为publicjava.lang.StringgetNamespace()。该方法获得该元素的名称空间。getParent方法可以声明为publicjava.lang.ObjectgetParent()。该方法获得该元素的父元素。getSibling方法可以声明为publicXSTElementgetSibling()。该方法获得该元素的同属元素。setProcessor方法可以声明为publicvoidsetProcessor(TemplateProcessorprocessor)。该方法设置处理器来处理该元素的模板。setParent方法可以声明为publicvoidsetParent(java.lang.Objectparent)。该方法设置该元素的父元素。setSibling方法可以声明为publicvoidsetSibling(XSTElementelem)。该方法设置该元素的同属元素。XSTtemplate的公共接口还处理XST处理语言的元素。该公共接口包括几种方法。getParentTemplate方法可以声明为publicXSTtemplategetParentTemplate()。该方法获得该模板的父模板。getID方法可以声明为publicintgetID()。该方法获得该模板的ID。getDOM方法可以声明为publicorg.w3c.dom.NodegetDOM()。该方法获得该模板的DOM对象。getOccurrences方法可以声明为publicintgetOccurrences()。该方法获得该模板的使用次数。getMaxOccurrences方法可以声明为publicintgetMaxOccurrences()。该方法获得所允许的该模板的最大使用次数。isVariable方法可以声明为publicbooleanisVariable(java.lang.Stringname)。该方法检查模板是否具有给定名称的变量。其返回旗标来指示模板是否具有给定名称的变量。setParentTemplate方法可以声明为publicvoidsetParentTemplate(XSTtemplatetempl)。该方法设置该模板的父模板。setVariable方法可以声明为publicbooleansetVariable(java.lang.Stringname,java.lang.Objectvalue)。该方法设置该模板中变量的内容。setVariable方法可以声明为publicbooleansetVariable(java.lang.Stringname,java.lang.Objectvalue,booleancheck)。该方法设置该模板中变量的内容。在其参数列表中name是变量名;value是要被设置的变量的内容;和check是指示应该被首先检查的变量的内容。Write方法可以声明为publicvoidwrite(java.io.OutputStreamos)throwsjava.io.IOexception。该方法将该模板的转换内容写入OutputStream(输出流)中。在第一实施例中使用的模板使用简单的规则有效地转换文档。然而,其依赖于模式附件框架来支持逻辑操作和调用Java扩展函数,这降低了性能并且增加了模板产生的复杂程度。第二实施例使用模板中一些熟悉的XSLT句法。其建立逻辑操作支持和向模板语言的Java扩展。该特性使XST执行复杂的转换。在下面显示了使用第二实施例的XSLT样式句法的模板。<xsttemplatename=″Root″><Root>BeginningofthetemplateforRoot<Boing><xstvarname=″Boing″/></Boing><Node2><xstvarname=″Node2″/></Node2>EndofthetemplateforRoot</Root></xsttemplate>在该样品中,属性“name”用于指定模板名。“Boing”和“Node2”是局部变量,并且它们的内容将自动发送到被转换的文档中。模板可以具有全局和局部变量。局部变量可以自动发送到输出文档。在下面的模板中,“myVar”是全局变量,其可以在下面的模板内容中引用。元素“Node22”是局部变量。其值是全局变量“myVar”的内容。<xsttemplatesname=″SimpleTransform″xmlnsxst=″http//www.commerceone.com/XST″version=″1.0″><xsttemplatename=″Root″dom=″Root″skip=″Node3|Node4″><xstvarname=”myVar”select=”Node2”/><Root>BeginningofthetemplateforRoot<Boing><xstvarname=″Boing″/></Boing><Node2><xstvarname=″Node2″/></Node2><Node22><xstvarname=″Node22″select=”$myVar”/></Node22>EndofthetemplateforRoot</Root></xsttemplate><xsttemplatename=″Node1″dom=″Node1″><Node1><xstvarname=″Node1″/></Node1></xsttemplate></xsttemplates>单一模板源用于在转换中使用的所有模板。模板源应该以元素<xsttemplates>开始。在上面的样品中源的名称是“SimpleTransform”。在上面的源代码中有两个模板,即Root和Node1。一旦加载,在模板源中所有模板将存储在存储器中以便快速访问。在转换期间将提供接口来在额外的模板中传送。在源流化期间通过在模板的属性中指定DOM的根节点,可以对源文档的片断或部分产生DOM。可以使用XPath表示或树操作来访问DOM。<xsttemplatename=”OrderParty”domsrc=”OrderContact”dom=”OrderContact”>......<OrderContactName><xstvarname=”ContactName”select=”//ContactName”/></OrderContactName>......</xsttemplate>在上面的例子中,属性“domsrc”为DOM源在输入文档中定义根节点。将使用该属性作为所产生的DOM名,用于其它模板来访问它。属性“dom”指定将在模板中使用的DOM名。一旦产生,DOM对于在转换中使用的所有模板是可访问的。下面是重复使用在先前的例子中由模板产生的DOM的模板。<xsttemplatename=”ShippinParty”dom=”OrderContact”>......<OrderContactName><xstvarname=”ContactName”select=”//ContactName”/></OrderContactName>......</xsttemplate>在第二实施例中支持逻辑操作“if”和“choose”。<xstiftest=”ContactName”><OrderContactName><xstvarname=”ContactName”/></OrderContactName></xst:if>在该实例中,测试是在叶节点“ContactName”上。如果测试不在叶节点上,则必须使用有效的XPath表示,并且用于XPath的上下文节点/DOM应该是有效的。<xsttemplatename=”ShippingParty”dom=”OrderContact”>......<xstiftest=”//OrderContact/Contact”><OrderContactName><xstvarname=”ContactName”select=”//OrderContact/Contact/ContactName”/></OrderContactName></xstif>......</xsttemplate>还支持逻辑操作<choose>。元素<choose>具有子元素<when>和<otherwise>。<xslchoose><xslwhentest=″UOMCodedOther″><UOMCoded><xstvarname=”UOMCodedOther“/></UOMCoded></xslwhen><xslotherwise><UOMCoded>xstvarname=”UOMCoded”/></UOMCoded></xslotherwise></xslchoose>元素<choose>可以具有多个子元素<otherwise>来支持多个选项。<xslchoose><xslwhentest=″UOMCodedOther″><UOMCoded><xstvarname=”UOMCodedOther“/></UOMCoded></xslwhen><xslotherwisetest=”UOMCoded“><UOMCoded><xstvarname=”UOMCoded”/></UOMCoded></xslotherwise><xslotherwise><UOMCoded>NoUOMCodedInfo</UOMCoded></xslotherwise></xslchoose>仅仅最后的子元素<otherwise>不具有属性“test”。在第二实施例中支持下面的内建函数。字符串函数<xstvarname=”StreetAddress”select=”string(‘19191ValcoParkway’)”/><xstvarname”City”select=”string(‘Cupertino’)”/>连接函数<xstvarname=”Address”select=”concat($StreetAddress,‘,’)”/><xstvarname=”Address”select=”concat($StreetAddress,$City)”/>字符串长度函数<xstvarname=”Length”select=”string-length($StreetAddress)”/>子字符串函数<xstvarname=”StreetAddress”select=”sub-string($Address,0,19)”/>在上面的模板中,给定变量$Address=”19191ValcoParkway,Cupertino”,对于变量“StreetAdress”从子字符串函数返回的值是“19191ValcoParkway”。还可以支持由XSLT支持的额外的内建函数,诸如加(+)、减(-)、乘(*)、除(div)等。通过使用名称空间/前缀“java”,可以像内建函数那样使用Java扩展函数。<xsttemplatename=”OrderInfo”xmlnsjava=http//www.commerceone.com/xst/java>......<xstvarname=”OrderDate”select=”string(‘20011012T17:56:20’)”/><xstvarname=”Date”select=”test.extensions.DateInfogetXCBLDate($OrderDate)”/>......</xsttemplate>在模板中使用的用来调用Java扩展函数的参数数量应该匹配Java扩展函数的参数数量<!--Globalvariablesusingbuilt-infunctions--><xstvarname=″gVar1″select=″string(′Thisisaglobalvariable′)″/><xstvarname=″gVar2″select=″string-length(′Thisisaglobalvarible′)″/><Root>BeginningofthetemplateforRoot<!--Modifyglobalvariables--><ModifiedGlobalVariable><xstvarname=″gVar1″select=″concat($gVar1,′-modified′)″/></ModifiedGlobalVariable><ModifiedGlobalVariable><xstvarname″gVar2″select=″number($gVar2+100.50)″/></ModifiedGlobalVariable><!--Modifyagaintheglobalvariable--><AgainModifiedGlobalVariable><xstvarname=″gVar1″select=″concat($gVar1,′-again′)″/></AgainModifiedGlobalVariable>在图15A中可以找到每个XST元素的模式。在图15A中,可以确定用于元素属性的属性值(需要的或选择性的)。XML元素模板是模板源文档的根元素。在上面的议论中并且如下面显示的那样,其可以具有子注释并包括模板。<xsttemplatesname=”binding”xmlnsxst=″http//www.commerceone.com/XST″version=″1.0″><xstcomment>Thisisasampletemplates</xstcomment><!-Firsttemplate--><xsttemplatename=″Root″><Root><Boing><xstbind-templatename=″Node1″/></Boing><Node2><xstvarname=″Node2″select=”Node2”/><xstval-ofselect=”$Node2”/></Node2></Root></xsttemplate><!-Secondtemplate--><xsttemplatename=″Node1″><Node1><xstval-ofselect=″param(Node1)″/></Node1></xsttemplate></xsttemplates>在该样品中,元素val-of用于<Node1>的内容,而var和val-of用于元素<Node2>的内容。将在下面讨论这些使用。元素模板在模板的范围/有效期中提供用于转换的规则。其还为目标/转换的文档提供布局。由于元素在源文档中匹配,在startElement的SAX事件激活或加载模板,并且在endElement的SAX事件对相同的元素卸载模板。如果可能,XST在endElement的事件上尝试发送模板的转换的内容。模板元素的句法是<xsttemplatematch=”elementnametomatch”namespace=”namespacetomatch”copy=”true|false”deferred=”true|false”inclusive=”true|false”alias=”nameonlyusedwhenattributecopyistureandinclusiveisfalse”domsrc=”nameoftherootelementforthedom”skip=”listofelementstobeskiped”param=”listofelementstobesaved”friend=”id(reservedforfutureuse)”>...</xsttemplate>在该句法中,match是要匹配在starElement/endElement的SAX事件将加载/卸载模板的元素的源文档中元素的ID/名称。Namespace是匹配元素的名称空间。默认值是空。Copy是指定默认的行为是否是将源复制到目标文档的旗标。默认值为假。Deferred是指定是否将模板内容的输出延迟到输出其父模板的内容时的旗标。默认值是假。Inclusive是指定当copy=true时将根元素的名称复制到目标文档。默认值是真。Alias是当copy=true并且inclusive=false时复制到目标文档的根元素的名称的替换。默认值是空。Domsrc是对于其在该模板的范围内产生DOM(使用其作为根元素)的源文档中的元素名。DOM总是作为全局对象产生并且对于所有模板是可访问的。默认值是空。Skip包括在转换期间要跳过的元素的、由“|”分隔的一列名称。默认值是空。Param是在转换期间要存储为将来使用的元素的、由“|”分隔的一列名称。默认值是空。Friend是要匹配的源文档中元素名的别名。默认值是空。由于由SZX事件触发模板的激活或加载和去激活或卸载,父模板可以用于将其子模板的执行/输出延迟到父模板的输出时。这是确保在源文档的流处理期间在执行其子模板之前所需的信息是有效的。再次,元素val-of用于将所选的内容发送到目标文档。<xstval-ofselect=”selectexpression”dom=”domid”disable-output-escaping=”yes|false”</xstvalue-of>使用有效地XPath表示可以初始化元素val-of。下面的表示可以用作属性select的值。Param指的是模板的局部参数。例如<xstval-ofselect=”param(CountryCode)”/>。Variable是可变变量。例如<xstval-ofselect=”$v”/>。内建函数包括上述那些XST内建函数。例如<xstval-ofselect=”string(‘myvariable’)”/>。Javaextension是Java扩展函数。其必须包括由“”分隔的类路径和方法名。例如<xstval-ofselect=”com.commerceone.xst.test.InfoRetrivergetDateTime($v0,2000)”/>。XPath/DOM是使用DOM的有效Xpath表示。例如<xstval-ofselect=”//ListOfItemDetail/ItemDetail”dom=”ListOfItemDetail”/>。属性dom用于为select/XPath表示指定DOM源。属性disable-output-escaping用于禁止转义下面的字符、<、>和&。默认是分别将这些字符转义为<&gt和&amp。元素var用于在XST中定义/声明变量。变量在XST中是可变的。对于模板变量可以使全局或局部变量。作为模板的直接子元素的所有变量是全局变量并且对于多有模板是可访问的。<xstvarname=”id”select=”selectexpression”dom=”domid”</xstvar>使用有效的XPath表示可以初始化元素。属性dom可以用于指定DOM作为select/XPath表示的源。用于元素val-of的相同表示组可以用于元素var。下面的代码引用说明了上述表示<xsttemplatesname=”variables”xmlnsxst=″http//www.commerceone.com/XST″version=″1.0″><xsttemplatename=″Root″><!--Globalvariablesusingbuit-infunctions--><xstvarname=″gVar1″select=″string(′Thisisaglobalvariable′)″/><xstvarname=″gVar2″select=″string-length(′Thisisaglobalvariable′)″/><Root><!-Useglobalvariables--><UseGlobalVariable><xstval-ofselect=″$gVar1″/></UseGlobalVariable><UseGlobalVariable><xstval-ofselect=″$gVar2″/></UseGlobalVariable><!--Modifyglobalvariablesusingbuilt-infunctions--><ModifiedGlobalVariable><xstvarname=″gVar1″select=″concat($gVar1,′-modified′)″/><xstval-ofselect=”$gVar1”/></ModifiedGlobalVariable><ModifiedGlobalVarable><xstvarname=″gVar2″select=″number($gVar2+100.50)″/><xstva1-ofselect=”$gVar2”/></ModifiedGlobalVariable><!--Modifyagainglobalvariables--><AgainModifiedGlobalVariable><xstvarname=″gVar1″select=″concat($gVar1,′-again′)″/><xstval-ofselect=”$gVar1”/></AgainModifiedGlobalVariable><ValOfNode2><xstval-ofselect=″param(Node2)″/></ValOfNode2><!-Useaparam--><Node1><xstval-ofselect=”param(Node1)”/></Node1><Node2><xstvarname=″Node2″select=”Node2”/><xstval-ofselect=”$Node2”/></Node2><UseLocalVariable><xstval-ofselect=″concat(′**′,$Node2,′**′)″/></UseLocalVariable><Root></xsttemplate></xsttemplates>在下面的几个例子中,使用下面的XML源输入<Root><Boing><Node1bingo=″dingo″>ThisisNode1</Node1></Boing><Node2>ThisisNode2</Node2></Root>使用上述模板转换的该XML源输入产生下列输出<Root><UseGlobalVariable>Thisisaglobalvariable</UseGlobalVariable><UseGlobalVariable>25</UseGlobalVariable><ModifiedGlobalVariable>Thisisaglobalvariable-modified</ModifiedGlobalVariable><ModifiedGlobalVariable>125.5</ModifiedGlobalVariable><AgainModifiedGlobalVariable>Thisisaglobalvariable-modified-again</AgainModifiedGlobalVariable><ValOfNode2>ThisisNode2</ValOfNode2><Node1>ThisisNode1</Node1><Node2>ThisisNode2</Node2><UseLocalVariable>**ThisisNode2**</UseLocalVariable></Root>下面是使用DOM属性的样品模板<xsttemplatesname=″doms-2″xmlnsxst=″http//www.commerceone.com/XST″version=″1.0″><xsttemplatename=″Root″><!-BindtemplateNode1forDOMcreation--><xstbind-templatename=″Node1″/><Root><!-DOM/XPath.TheDOMiscreatedintemplateNode1--><Node1><xstval-ofselect=″//Node1[@bingo=′dingo-1.1′]″dom=”node1”/></Node1><Node1-attribute><xstval-ofselect=″//@bingo″/dom=”node1”></Node1-attribute><Node1-attribute><xstval-ofselect=″//@bingo=′dingo-1dom=”node1”/></Node1-attribute></Root></xsttemplate><!-TemplateusedonlytocreatetheDOM--><xsttemplatename=″Node1″copy=”false”domsrc=″Node1″/></xsttemplates>在模板Node1中产生在上面模板Root中使用的DOM。使用该模板的输出文档的上面的源文档是<Root><Node1>ThisisNode1.1</Node1><Node1-attribute>dingo-1.1</Node1-attribute><Node1-attribute>false</Node1-attribute></Root>当模板attributematch匹配源文档中的元素名时,元素bind-template用于激活或连接模板。当模板属性copy是假时,这才是必要的。当copy是真时,只要子模板匹配源文档中的元素,模板可以在其范围内连接/加载任何模板。由于匹配并激活模板的句法是<xstbind-templatename=”id”>。下面的模板<xsttemplatesname=″bindings″xmlnsxst=″http//www.commerceone.com/XST″version=″1.0″><xsttemplatematch=″Root″>BeginningofthetemplateforRoot<Root><Boing><!--Bind/loadtemplateNode1--><xstbind-templatename=″Node1″/></Boing><Node2><xstval-ofselect=″param(Node2)″/></Node2></Root>EndofthetemplateforRoot</xsttemplate><xsttemplatename=″Node1″>BeginningofthetemplateforNode1<xstvarname=″Node1″select=”Node1”/><Node1><xstval-ofselect=″$Node1″/></Node1>EndofthetemplateforNode1</xsttemplate></xsttemplates>应用到上面的源输入,产生下面的输出BeginningoftemplateforRoot<Root><Boing>BeginningoftemplateforNode1<Node1>ThisisNode1</Node1>EndoftemplateforNode1</Boing><Node2>ThisisNode2</Node2></Root>EndofthetemplateforRoot元素attribute用于向用户定义的元素添加/附加属性。其句法是<xstattributename=”id”select=”selectexpression”</xstattribute>与元素val-of和var相似,select表示是有效的XPath表示。下面的模板<xsttemplatesname=″attributes″xmlnsxst=″http//www.commerceone.com/XST″versio=″1.0″><xsttemplatename=″Root″><xstvarname=″Node2″select=”Node2”/><Root><Node2><!--Attributeusingavariable--><xstattributename=″attrl″select=″$Node2″/><!--Attributeusingabuilt-infunction--><xstattributename=″attr2″select=″string(′myattribute2′)″/><!--Attributeusingaparam--><xstattributename=″attr3″select=″param(Node2)″/><xstval-ofselect=″param(Node2)″/></Node2></Root></xsttemplate></xsttemplates>当应用到上面的源输入时,产生下面的输出<Root><Node2attr1=″ThisisNode2″attr2=″myattribute2″attr3=″ThisisNode2″>ThisisNode2</Node2></Root>元素if、choose、when和otherwise用于在XST中提供逻辑操作。有效的XPath表示可以用于“测试表示”,也就是属性test的值。它们的句法为<xstiftest=”testexpression”>...</xstif>......<xstchoose><xstwhentest=”testexpression”>...</xstwhen><xstotherwisetest=”testexpression”>...</xstotherwise><xstotherwisetest=”testexpression”>...</xstotherwise>...<!-Thelastotherwiseinthelogicalconstructshouldnothaveatestexpression--><xstotherwise>...</xstotherwise></xstchoose>下面的模板<xsttemplatesname=″logical-operators″xmlnsxst=″http//www.commerceone.com/XST″version=″1.0″><xsttemplatename=″Root″><Root><xstvarname=″Node2″select=”Node2”/><Node2><xstval-ofselect=”$Node2”/></Node2><xstiftest=″$Node2=′ThisisNode2′″><ResultOfLogicalOperations>Node2=″ThisisNode2″</ResultOfLogicalOperations></xstif><xstiftest=″$Node2″><ResultOfLogicalOperations>Hasavariable-$Node2</ResultOfLogicalOperations></xstif><xstiftest=″not($Node2)″><ResultOfLogicalOperations>Doesnothasavariable-$Node2</ResultOfLogicalOperations></xstif><xstchoose><xstwhentest=″$Node2=′ThisisNode1′″><Out>ThisisNode1</Out></xstwhen><xstotherwisetest=″$Node2=′ThisisNode2′″><Out>ThisisNode2</Out></xstotherwise><xstotherwisetest=″$Node2=′ThisisNode3′″><Out>ThisisNode3</Out></xstotherwise><xstotherwise><Out>ThisisNodex</Out></xstotherwise></xstchoose></Root></xsttemplate></xsttemplates>应用到上面的源输入,产生下列输出<Root><Node2>ThisisNode2</Node2><ResultOfLogicalOperations>Node2=″ThisisNode2″</ResultOfLogicalOperations><ResultOfLogicalOperations>Hasavariable-$Node2</ResultOfLogicalOperations><Out>ThisisNode2</Out></Root>元素comment用于将注释添加到目标文档上。其可以是任何模板元素的子元素。其句法为<xstcomment>contentofthecomments</xstcomment>当对于模板元素bind-template、load-template和redirect动作失败时,元素fall-back用于提供机会来使应用处理错误事件或调试信息。<xsttemplate...>...<xstload-templatename=”$templateName”><xstfall-back><xstmessage>Failtoloadtemplate<xstvalue-ofselect=”$templateName”/></xstmessage></xstfall-back>...</xsttemplate>如果不能加载指定的模板,将消息(message)发送到由应用提供的错误处理器或目标文档。元素for-each用于在DOM或为输入文档的片断或子部分产生的其它树结构中循环一组节点。其句法为<xstfor-eachselect=”selectexpression”dom=”id”>....</xstfor-each>下面的模板<xsttemplatesname=″for-each″xmlnsxst=″http//www.w3.org/1999/XSL/Transform″version=″1.0″><xsttemplatename=″OrderDetail″domsrc=″ListOfItemDetail″><OrderDetail><xstfor-eachselect=″//ListOfItemDetail/ItemDetail″dom=”ListOfItemDetail”><BuyerLineItemNum><xstval-ofselect=″local-name()″/>-<xstval-ofselect=″.″/></BuyerLineItemNum></xstfor-each></OrderDetail></xsttemplate></xsttemplates>当应用到下面的源输入时<Order><OrderDetail><ListOfItemDetail><ItemDetail><BuyerLineItemNum>8001</BuyerLineItemNum></ItemDetail><ItemDetail><BuyerLineItemNum>8002</BuyerLineItemNum></ItemDetail></ListOfItemDetail></OrderDetail></Order>产生下面的输出<OrderDetail><BuyerLineItemNum>ItemDetail-8001</BuyerLineItemNum><BuyerLineItemNum>ItemDetail-8002</BuyerLineItemNum></OrderDetail>元素include用于包括在模板源中存储的额外模板。由应用提供的URIResolver用于解析所包括的源的uri。其句法为<xstincludehref=”uri”/>。元素loaded-template用于在存储器中动态激活或加载模板,作为正在输出的执行中的模板的内容。加载模板可以将属性传送到所加载的模板。这些属性不需要在所加载的模板中声明。所加载的模板可以访问包括局部变量和属性的加载模板的运行时间上下文。其句法为<xstload-templatename=”templateid”><xstwith-parmname=”id1”select=”selectexpression/><xstwith-parmname=”id2”select=”selectexpression/>...</xstload>根据第二实施例,下面的样品“模板”包括一对“模板”元素<xsttemplatesname=″loading″xmlnsxst=″http//www.commerceone.com/XST″version=″1.0″><xsttemplatename=″Root″><xstvarname=″Node1″select=”Node1”/><Root><Node1><xstload-templatename=″loaded″/><xstwith-paramname=″message″select=″string(ThisistheoutputfromaloadedtempateNode1isnotnull.′)″/></Node1></Root></xsttemplate><xsttemplatename=″loaded″><xstiftest=″$Node1″><xstvalue-ofselect=″$message″/></xstif></xsttemplates>在上面的样品中,模板“loaded”由模板“root”加载。在下面显示了在加载后等效的模板。<xsttemplatesname=″loading″xmlnsxst=″http//www.commerceone.com/XST″version=″1.0″><xsttemplatename=″Root″><xstvarname=″Node1″select=”Node1”/><Root><Node1><xstiftest=″$Node1″><xstvalue-ofselect=″string(′ThisistheoutputfromaloadedtemplateNode1isnotnull.′)″/></xstif></Root></xsttemplate></xsttemplates>元素message用于自定义的消息。其句法为<xstmessage>消息内容</xstmessage>。元素redirect用于将内容的一部分重定向到特定的目标。其句法为<xstredirecteref=”id”><!-Contenttoberedirected--></xstredirect>下面是使用redirect的样品模板<xsttemplatesname=″redirect″xmlnsxst=″http//www.w3.org/1999/XSL/Transform″version=″1.0″><xsttemplatename=″ChangeOrderHeader″>...<xstredirecteref=”http//www.commerceone.com/sql/db_id”><ChangeType><ChangeTypeCoded><xstval-ofselect=param(AddAdditionalItems)”/></ChangeTypeCoded></ChangeType></xstredirect>...</xsttemplate></xsttemplates>有效的XPath表示可以用于属性eref的值<xsttemplatesname=″redirect″xmlnsxst=″http//www.w3.org/1999/XSL/Transform″version=″1.0″><xsttemplatename=″ChangeOrderHeader″><xstvarname=”db_id”select=”param(refNum)”/>...<xstredirecteref=”concat(string(‘http//www.commerceone.com/sql/db_id’),$db_id)”><ChangeType><ChangeTypeCoded><xstval-ofselect=param(AddAdditionalItems)”/></ChangeTypeCoded></ChangeType></xstredirect>...</xsttemplate></xsttemplates>实体参考eref应该由应用提供的URIResolver进行解析,并且返回的应该是可以管理/关闭所打开的、用于“redirect”的Result对象的com.commerceone.xst.swi.jaxp.ResultManager的对象。在某些实施例中,支持转换的流和缓冲模式。在流模式转换中,根模板处于复制模式。当输出数据有效时,XST流出转换的内容的小型缓冲器。在加载或激活子模板之前,父模板将其转换的内容流出来清除其子模板的流路径。在卸载或去激活模板之前,模板将其转换的内容流出来清除其同属模板的流路径。在缓冲模式转换中,根模板不处于复制模式。XST不流出转换的内容。在卸载模板之前,如果其父模板处于复制模式,则其将模板的转换的内容附加到其父模板。当在该时刻转换所需的信息不可用时,使用延迟模式的模板。其提供小于整个转换的缓冲。延迟模式在模板处理期间暂停流的默认行为。延迟模式模板向其父模板注册而不是流出其内容。由于整个转换实际上是延迟的,所以延迟模式在缓冲式转换中是无效的。模板规则的一个实施例允许模板仅延迟一个注册的子模板。在一个实施例中,如果有注册的子模板,则父模板流出先前注册的子模板的任何转换的内容,并且在其注册新的子模板之前流出其自身的内容。在第一实施例中,使用伪模板可以实现要求的流。在startElement或endElement的SAX事件完成模板的转换内容的流。通过添加伪模板,我们可以引入额外的SAX事件来降低存储器中转换的内容,这将导致增加转换的速度。尽管已参照上述本发明的优选实例表示和描述了本发明,但应该理解的是,这些例子用于说明而不是限定。在描述的实施例中牵涉到计算机辅助处理。因此,可以以计算机辅助处理方法、包含逻辑来实现转换处理的系统、施加实现转换处理的逻辑的媒体、施加实现转换处理的逻辑的数据流或计算机可访问的转换处理服务来实现本发明。对于本领域技术人员来说修改和组合是显而易见的,可在不背离由所附权利要求书限定的本发明宗旨和范围的前提下对本发明进行各种形式和细节上的修改。权利要求1.一种转换文档的方法,包括接收流中的事件,包括多个元素开始事件、输入事件和元素结束事件;通过使元素与指定模板匹配并激活模板,或者在不存在匹配时,通过将元素当作父元素的内容,来响应元素的元素开始事件;若匹配,则使用匹配指定模板来响应关于当前元素的元素结束事件,包括响应匹配指定模板中的指令,输出至少一些文字文本或对应于当前元素的输入事件;清除对应于当前元素的内容的输入事件;及去激活匹配指定模板。2.如权利要求1所述的方法,其中流中的事件对应于电子商务文档。3.如权利要求1所述的方法,其中流中的事件对应于包含编码文本字符的字符数据和根据文档的逻辑结构标识存储单元组的标记数据的文档。4.如权利要求1所述的方法,其中流中的事件对应于包含编码文本字符的字符数据和根据电子商务文档的逻辑结构标识存储单元组的标记数据的电子商务文档。5.如权利要求1所述的方法,其中多个指定模板实例一起存储在模板源中。6.如权利要求2所述的方法,其中多个指定模板实例一起存储在模板源中。7.如权利要求3所述的方法,其中多个指定模板实例一起存储在模板源中。8.如权利要求1所述的方法,其中响应元素开始事件还包括在对应于指定模板的范围内激活一个或多个变量,而响应对应的元素结束事件还包括去激活变量。9.如权利要求3所述的方法,其中响应元素开始事件还包括在对应于指定模板的范围内激活一个或多个变量,而响应对应的元素结束事件还包括去激活变量。10.如权利要求7所述的方法,其中响应元素开始事件还包括在对应于指定模板的范围内激活一个或多个变量,而响应对应的元素结束事件还包括去激活变量。11.如权利要求8所述的方法,其中响应对应于指定模板的元素结束事件还包括处理逻辑指令来操作变量。12.如权利要求11所述的方法,其中逻辑指令选择性地包括子字符串和串联。13.如权利要求11所述的方法,其中逻辑指令选择性地包括if和choose流程控制操作符。14.如权利要求11所述的方法,其中逻辑指令选择性地包括if、choose、when、otherwise和for-each流程控制操作符。15.如权利要求1所述的方法,其中响应元素开始事件还包括响应与匹配指定模板相关的指令,在指定模板的范围内产生元素和子元素的树表示。16.如权利要求13所述的方法,其中响应元素开始事件还包括响应与匹配指定模板相关的指令,初始化在指定模板的范围内元素和子元素的树表示的产生。17.一种转换文档的计算机实现的方法,包括接收流中的事件,包括多个元素开始事件、输入事件和元素结束事件;通过使元素与指定模板匹配并激活模板,并且若存在变量则在对应于指定模板的范围中激活变量,来响应元素的元素开始事件;通过将嵌套的元素与额外的指定模板匹配并激活额外的指定模板,并且若存在变量则在对应于额外的指定模板的范围中激活变量,或者当不存在匹配时,通过将嵌套的元素当作父元素的内容,来响应嵌套的元素开始事件;根据最近激活的指定模板中的指令响应输入事件,其中指令选择性地包括将输入赋予一个或多个变量。若存在响应,则通过处理对应的指定模板,来响应当前元素的元素结束事件,包括处理指定模板中的指令,其中指令选择性地包括操作变量并且输出至少一些文字文本和变量;清除对应于指定模板的范围内的变量;及去激活对应的指定模板。18.如权利要求17所述的方法,其中流中的事件对应于电子商务文档。19.如权利要求17所述的方法,其中流中的事件对应于包含编码文本字符的字符数据和根据文档的逻辑结构标识存储单元组的标记数据的文档。20.如权利要求17所述的方法,其中流中的事件对应于包含编码文本字符的字符数据和根据电子商务文档的逻辑结构标识存储单元组的标记数据的电子商务文档。21.如权利要求17所述的方法,其中多个指定模板实例一起存储在模板源中。22.如权利要求18所述的方法,其中多个指定模板实例一起存储在模板源中。23.如权利要求19所述的方法,其中多个指定模板实例一起存储在模板源中。24.如权利要求17所述的方法,其中响应对应于指定模板的元素结束事件还包括处理逻辑指令来操作变量。25.如权利要求24所述的方法,其中逻辑指令选择性地包括子字符串和串联。26.如权利要求24所述的方法,其中逻辑指令选择性地包括if和choose流程控制操作符。27.如权利要求24所述的方法,其中逻辑指令选择性地包括if、choose、when、otherwise和for-each流程控制操作符。28.如权利要求17所述的方法,其中响应元素开始事件还包括响应与匹配指定模板相关的指令,在指定模板的范围内产生元素和子元素的树表示。29.如权利要求26所述的方法,其中响应元素开始事件还包括响应与匹配指定模板相关的指令,在指定模板的范围内产生元素和子元素的树表示。30.一种当对XML文档执行转换时的存储器使用策略,包括加载包括一个或多个子模板的模板;从输入源处理事件流,包括重复将子模板与输入源中的开始事件匹配;缓冲输入流直到接收到与开始事件匹配的结束事件;及在子模板中处理指令来转换所缓冲的输入流,输出处理结果并且释放以便重复用于缓冲和处理的存储器。31.如权利要求30所述的方法,其中将子模板与开始事件匹配还包括在对应于子模板的范围内激活一个或多个变量,并且为重复使用的释放还包括去激活变量。32.如权利要求30所述的方法,其中逻辑指令选择性地包括子字符串和串联。33.如权利要求30所述的方法,其中逻辑指令选择性地包括if和choose流程控制操作符。34.如权利要求30所述的方法,其中逻辑指令选择性地包括if、choose、when、otherwise和for-each流程控制操作符。35.如权利要求30所述的方法,其中逻辑指令选择性地包括调用用户自定义扩展。36.如权利要求35所述的方法,其中用户自定义扩展是由Java编程语言写的。37.如权利要求30所述的方法,还包括在处理子模板之前,调用至少一个额外的处理器来预处理输入流。38.如权利要求30所述的方法,其中输出结果包括调用至少一个额外处理器来进一步处理子模板处理结果。39.如权利要求30所述的方法,其中将子模板与开始事件匹配还包括响应与子模板相关的指令,在子模板的范围内产生元素和子元素的树表示。全文摘要本发明包括用于指定文档转换(1303)并且将文档转换为流模式,而不需要在存储器中建立表示文档(1410)的完全对象树的设备和方法。在权利要求、说明书和附图中描述了本发明详细内容。文档编号G06Q50/00GK1689022SQ03824132公开日2005年10月26日申请日期2003年8月13日优先权日2002年8月16日发明者马修·富克斯,朱昌毅申请人:Jgr阿奎西申公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1