会员体验
专利管家(专利管理)
工作空间(专利管理)
风险监控(情报监控)
数据分析(专利分析)
侵权分析(诉讼无效)
联系我们
交流群
官方交流:
QQ群: 891211   
微信请扫码    >>>
现在联系顾问~
首页 / 专利库 / 专利权 / 申请 / 国际申请 / 附图 / 可扩展标记语言流化转换器

可扩展标记语言流化转换器

阅读:1014发布:2020-07-01

IPRDB可以提供可扩展标记语言流化转换器专利检索,专利查询,专利分析的服务。并且本发明包括用于指定文档转换(1303)并且将文档转换为流模式,而不需要在存储器中建立表示文档(1410)的完全对象树的设备和方法。在权利要求、说明书和附图中描述了本发明详细内容。,下面是可扩展标记语言流化转换器专利的具体信息内容。

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所述的方法,其中将子模板与开始事件匹配还包括: 响应与子模板相关的指令,在子模板的范围内产生元素和子元素的树表示。

说明书全文

技术领域

本发明涉及用于文档的固定和非常低的存储器使用量转换的系统和方 法,其中该文档被当作离散处理事件的流,而不需要将要构造的所有元素之 间的分级关系的表示(representation),也不需要横跨文档的这种分级对象 表示来完成转换。本发明尤其涉及用于转换XML文档的系统和协议。

背景技术

商业机构-商业机构(B2B)和应用-应用(A2A)电子商务正在取代以前 用于电子数据交换(EDI)的协议。由于商业机构致力于使用B2B和A2A系统 来改善其效率,涌现了许多不兼容的平台和竞争的标准。一种已经被证实的 需要是转换XML文档,典型地将文档从一个系统转换到另一个系统。使用转 换的另一个原因是标准可能具有几种版本,并且一端使用旧的版本而另一端 使用更新的版本。
由于必须应用来产生内嵌标记(inline markup)的严格的规则使计算机 程序分析并处理文本文档的内容相对简单,所以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”那样简单。它们可以进一步包括“for each”、 “when”和“otherwise”操作符。还可以使用诸如“else”和“then-else”等 的结构。某些控制操作符的流程对被转换为树结构的输入文档的片断和子部 分进行操作。
图2是事件处理的另一个方框图。该事件处理还对指定模板元素进行操 作。由从系统分离的分析器或系统的部件产生事件流101。处理模块接收事 件流102。在104其如上所述那样匹配开始事件103。响应匹配,系统可以建 立一个或多个变量来存储内容、属性或对应于元素的标签。根据模板元素的 结构,变量具有局部和全局范围。当变量具有局部范围时,只要对应的指定 模板有效它们就有效。当变量具有全局范围时,它们在整个文档转换中是有 效的。系统通常通过上述输出处理106处理结束事件105。除处理来自模板 的文字文本和来自流的输入事件外,处理还可以包括操作变量,包括将输入 流的各部分赋予变量并且实行对变量执行逻辑、字符串、算术或其它运算。 不论操作与否,都可以输出变量的内容。处理还可以包括上述的控制指令的 流程和外部处理的调用。外部处理可以包括以下将要进一步描述的Java类和 方法。
在第一实施例中,XST模板语言支持下列三个处理指令: 是XST模板的打开标记,并用于在一个文件中存储多个模板。是XST 处理指令的打开标记。是XST变量的打开标记。
在另一个实施例中,处理指令被当作模板的属性处理,并且将“模板” 标记作为父类提供给“模板”标记的多个实例。
XST模板是包括字符串文字和模板变量的文本文件。变量具有使用打开 标记和关闭标记的格式变量名。变量提 供模板和其对应的源XML文档之间的连接(binding)。
转换始于分析XML文档。当XML文档具有根元素时,XST转换具有 根模板。如果元素名是根,则模板命名为将根元素名称与扩展名“.tpl”组合 起来的root.tpl,其中根是某种任意的元素的名称。通过XML文档中的其父 元素,子模板可以附加到父模板。
在另一个实施例中,XST转换引擎可以以流或缓冲的模式操作。与模板 相似,转换的中间输出包括字符串文字和模板变量。在流模式中,当去激活 或卸载模板时,流化每个模板的所传递的输出。在缓冲模式中,输出转换的 结果,而在转换结束或父模板去激活时清除中间存储器的内容。在每个模板 中,输出中的元素次序可以与输入文档中的元素次序不同。
通过设计,XST转换重复使用加载的模板。在一个实施例中,用于XML 的加载模板的列表存储在该文档的根模板的名称下。在存储器中存储所有列 表以便快速访问。实际上,为了最小化存储器的使用量,引擎将转换的结果 写到目标输出流上。
对应于XML文档的XST转换包括一个或更多对应于XML文档的元素 的模板。多个模板可以存储在一个文件中。XML文档的元素名和模板名的单 独比较确定是否存在应该在转换期间被激活或加载的匹配模板。模板名可以 由名称空间名限定。
XST转换引擎提供公共接口以使用默认或用户所选的XML分析器/读取 器来转换XML文档。其还支持用于XML分析(JAXP)接口的Java API。引 擎作为单独服务或其它服务的一部分运行。
如图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.et al.,“The Schema Adjunct Framework”,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文档的元素的内容提供当前 日期和时间。Java类被用于这种扩展。

  
    BuyerChangeOrderNumber,
    ChangeOrderIssueDate;RefNumber

  

    . 
  
    test:xst templates InfoRetriever
    getDateTime
  
  .... 
 
在上面的例子中,元素的内容指定将要由XST存储到散列 表(hashtable)中的一列叶元素;RefDate对应于源XML文档的元素名; test.xst.templates.InfoRetriever是提供模式附件扩展的Java类名;并且 getDateTime是所调用的这种类的方法名。使SA扩展能够从源 XML文档访问已经由XST处理的元素。
在下面显示了Java类的样品码,用于为元素提供更新的信息。
     /*
     *File Name InfoRetrievei java
     */
     package test templates,
     import java util Hashtable,
     import java util Date,
     import java util Properties,
     import com commerceone xst utils PropertyReader,
     public class InfoRetriever
     {
      private Properties props,
      public InfoRetriever()
      {
        this props=PropertyReader getProperties(PROP_FILE)
      }
.....
public String getDateTime(String localName,String value,Hashtable ht,String event)
{
 return(new Date()).toString();
}
static private int cnt=0;
static private String PROP_FILE=″test/templates/DefaultInfo.prop″;
}
如以上样品代码所示,提供SAF扩展的方法可以具有四参数(argument), 其中在转换中localName和value对应于原始XML文档的元素的名称和值; ht是用于存储一列由SAF文档中的元素的内容指定的叶元素的散 列表;和event是当调用方法时的SAX事件名。应当说明的是,不在样品代 码中使用传送到该方法的自变量。当启动查找时,由XST调用上述方法来向 经受转换的元素提供额外的信息。
下面的例子显示具有元素的源文档的样品ChangeOrder.xml。
<?soxtype urn:x-
commerceone:document:com commerceone:XCBL35 XCBL35 sox$1.0?>

  
    
      4500006637      BuyerChangeOrderNumber>
    

    
    20010521T120000
    
      
        4500006637
        20010521T1527:17
      

    

    
    ....
  

  .. 

利用SAF扩展处理中的大多数逻辑,使用简单模板来转换ChangeOrder 元素:

NAME=ChangeOrder.tpl;COPY=true

使用以上显示的模板和SAF文档以及Java类,并且在2001年9月21 日在15点27分17秒时运行XST,产生下列转换文档:
<?soxtype urn:x-
commerceone:document:com:commerceone:XCBL35:XCBL35:sox$10?>

  
    
  4500006637|
  

  
  20010521T12:00:00
  
    
      4500006637
      20010921T15:27:17
    

  

    
    ...... 
   

   ......

在经过转换的该文档中,元素具有由Java SA扩展提供的、更 新的日期/时间。
下面的例子说明了怎样使用SAF来将额外的信息提供到XML文档的字 段“address1”。Java类被用于这种扩展。

  ..... 
  
    test:xst:templates:AddressRetriever
    getAdditionalAddressInfo
    replace
  
   ......
 
其中“address1”是原始XML文档中要被转换/修改的字段;“test.xst.templates. AddressRetriever”是Java类名;“getAddtionalAddressInfo”是将要调用的这 种类的方法名;和“replace”是对返回的值的操作模式。使用的Java类的样 品代码显示如下:
package test xst.templates;
public class AddressRetriever
{
 public AddressRetriever(){}
 public String getNewAddressInfo(String localName,String value,Hashtable params)
 {
  return″The new address is:″+localName+″=″+value,
 }
 publi String getAdditionalAddressInfo(String localName,String value,Hashtable
params)
 {
  return″!!Additional address info for″+localName+″The original value is″+
value+″″;
 }
}
该方法的签名可以具有三参数“String localName”、“String value”和 “Hashtable params”。其中“localName”和“value”对应于原始XML文档 中经转换的字段的名称和值;和“Hashtable params”是用于存储一列在模式 附件文档中指定的名称和其在XML文档中的有效值的“散列表”。当启动查 找时,由XST调用上面的方法来向经受转换的XML文档提供额外的信息。
XST转换引擎使用诸如Xerces之类的默认XML分析器或用户选择的分 析器提供接口来转换XML文档。在图11和12中,使用两个可供选择的分析 器来产生事件流。在该环境下说明的特定分析器是XML分析器。分析器是 默认的Commerce One XML分析器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通过诸如Commerce One CXP分析器 或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()方法可以声明为:public java.io.OutputStream getOutputStream()。该方法返回在该转换中使用的目标输 出流。getContentHandler方法可以声明为:public org.xml.sax.ContentHandler getContentHandler()。该方法返回该处理器的ContentHandler。getTemplate方 法可以声明为:public java.util.Hashtable getTemplates()。该方法获得当前模板 列表。putTemplates  方法可以声明为:public void putTemplates (java.util.Hashtable tempList)。该方法将一列模板放入当前或激活的模板列表 中。setOutputStream方法可以声明为:public void setOutputStream (java.io.OutputStream os)。该方法为该转换设置输出流。 setSiblingContentHandler方法可以声明为:public void setSiblingContentHandler (org.xml.sax.ContentHandler hanlder)。该方法将同属(sibling)处理器放入同 属列表的末尾。
用于文档处理器的公共接口扩展模板处理器。其还包括几种方法。其从 SAX适应(compliant)模板处理器继承包括characters、comment、endDocment、 endElment、processingInstruciton、pushElement、pushTemplate、statDocument 和startElement的方法。此外,文档处理器接口的getOutputStream方法可以 声明为:public java.io.OutputStream getOutputStream()。该方法获得由该处理 器使用的输出流。对于流模式转换该对象不能为空。getDOMByRootName方 法可以声明为:public org.w3c.dom.Node getDOMByRootName (java.lang.string.name)。该方法检索给定名称的DOM对象。getOutputTemplate 方法可以声明为:public XSTtemplate getOutputTemplate()。该方法获得作为该 转换的根模板的输出模板。getSchemaPath方法可以声明为:public java.lang.String.getSchemaPath()。该方法获得用于模式附件文档的模式路径。 getTemplatePath方法可以声明为:public java.lang.String.getTemplatePath()。 该方法获得模板路径。getTemplate方法可以声明为:public java.util.Hashtable getTemplate()。该方法获得当前模板列表。getXPathContext方法可以声明为: public org.apache.xpath.XPathContextgetXPathContext。该方法获得XPath运行 上下文,其应该包括源文档树中的上下文节点。Lookup方法可以声明为: public java.lang.Stringlookup(java.lang.String key,java.lang.String value, java.util.Hashtable ht,java.lang.String method,java.lang.String event, XSTtemplate templ)。该方法使用指定方法查找给定节点的值。在其参数列表 中:localName是上下文节点的名称,其还是第一选择的名称;value是上下 文节点的值;ht是用于存储在模板中指定的参数的值的散列表;method是用 于查找的方法名;event是当调用该方法时的SAX事件;和templ是上下文节 点的模板。该方法返回给定上下文节点的值。putTemplates方法可以声明为: public void putTemplates(java.util.Hashtable tempList)。该方法将一列模板添加 到当前模板列表中。setOutputStream方法可以声明为:public void setOutputStream(java.io.OutputStream os)。该方法设置该处理器的 OutputStream(输出流),用于流模式转换。setSchemaPath方法可以声明为: public void setSchemaPath(java.lang.String path)。该方法设置用于模式附件文 档的模式路径。setTemplatePath方法可以声明为:public void setTemplatePath (java.lang.String path)。该方法设置模式路径。
TemplateProcessor(模板处理器)的公共接口包括几种方法。getTemplates 方法可以声明为public java.util.Hashtable getTemplates()。该方法获得当前模 板列表。pushElement方法可以声明为:public void pushElement(java.lang.Object elem)。这种方法将元素推入元素堆栈。 pushTemplate方法可以声明为:public void pushTemplate(java.lang.Strmg name, java.lang.Object templ)。这种方法当名称是将要推入的对象的名称并且templ 是将要推入的模板的对象时,将模板推入模板堆栈。characters方法可以声明 为:public void characters(char[]ch,int start,int length)throws org.xml.sax.SAXException。这是用于字符和输入的SAX事件处理器接口。在 其参数列表中:ch是包含当前元素的值的字符数组;start是用于当前元素值 的字符数组中的第一字符的索引;和length是用于当前元素值的字符数量。 endDocument方法可以声明为:public void endElement(java lang.String namespace,java.lang.String localName,java.lang.String rawName),throws org.xml.sax.SAXException。这是用于endElement的SAX事件处理器接口。 在其参数列表中:localName是没有前缀的当前元素的节点名;和rawName 是当前元素的限定名(具有前缀)。
startDocument方法可以声明为:public void startDocument()throws org.xml.sax.SAXException。这是用于startDocument的SAX事件处理器接口。 startElement方法可以声明为:public void startElement(java.lang.String namespace,java.lang.String localName,java.lang.String rawName,org.xml. sax.Attributes atts)throws org.xml.sax.SAXException,javax.xml.transform. ThansformationException,java.io.IOException。SAX事件处理器接口: startElement。在其参数列表中:namespace是当前元素的名称空间;localName 是当前元素(没有前缀)的限定名的本地部分;rawName是当前元素(具有 前缀)的限定名;和attributes是与当前元素相关的属性列表。 processingInstruction方法可以声明为:public void processingInstruction (java.lang.String target,java.lang.String data)throws org.xml.sax.SAXException。 这是用于processingInstruction的SAX事件处理器。在其参数列表中:target 是处理指令目标;和data是处理指令数据,或如果没有提供任何事物的情况 下是空。该方法放弃可以是包含另一个例外的SAX例外的任何 org.xml.sax.SAXException。支持注释。
公共接口XSTElement支持XST转换语言的元素。在第一和第二实施例 之间该接口的详细内容不同。第一实施例包括几种方法。appendChild方法可 以声明为:public void appendChild(XSTElement elem)。该方法将子元素附加 到该元素上。appendAndPushChild方法可以声明为public void appendAndPushChild(XSTElement elem)。该方法将子元素附加到该元素并且 将子元素推入其处理器的元素堆栈。appendContent方法可以声明力:public void appendContent(java.lang.Object content)。该方法将对象的内容附加到该 元素的内容。attachChild方法可以声明为:public void attachChild(XSTElement elem)。即使其可能不是直接子元素,该方法也将子元素加到该元素。Clone 方法可以声明为:public java.lang.Object clone()。该方法克隆该元素并且返回 复本。cloneAll方法可以声明为:public XSElement cloneAll()。该方法克隆该 元素并包含其所有子元素。execute方法可以声明为:public java.lang.Object excute()。该方法是元素转换的入口。其返回元素转换的结果。execute方法可 以声明为:public void excute(java.io.OutputStream os)throws java.io.IOException。该方法执行该元素的转换并且将结果发送到 OutputStream(输出流)。getAttribute方法可以声明为:public java.lang.String getAttribute(java.lang.String qname)。该方法检索给定名称的属性的内容。 getChild方法可以声明为:public XSTElement getChild()。该方法获得该元素 的第一子元素。getContent方法可以声明为:public java.lang.getContent()。该 方法获得该元素的内容。getElementName方法可以声明为:public java.lang.String getElementName()。该方法获得该元素的属性名。getName方 法可以声明为:public java.lang.String getName()。该方法获得该元素的名称。 getNamespace方法可以声明为:public java.lang.String getNamespace()。该方 法获得该元素的名称空间。getParent方法可以声明为:public java.lang.Object getParent()。该方法获得该元素的父元素。getSibling方法可以声明为:public XSTElement getSibling()。该方法获得该元素的同属元素。setProcessor方法可 以声明为:public void setProcessor(TemplateProcessor processor)。该方法设置 处理器来处理该元素的模板。setParent方法可以声明为:public void setParent(java.lang.Object parent)。该方法设置该元素的父元素。setSiblmg方 法可以声明为:public void setSibling(XSTElement elem)。该方法设置该元素 的同属元素。
XSTtemplate的公共接口还处理XST处理语言的元素。该公共接口包括 几种方法。getParentTemplate方法可以声明为:public XSTtemplate getParentTemplate()。该方法获得该模板的父模板。getID方法可以声明为public int getID()。该方法获得该模板的ID。getDOM方法可以声明为:public org.w3c.dom.Node getDOM()。该方法获得该模板的DOM对象。getOccurrences 方法可以声明为:public int getOccurrences()。该方法获得该模板的使用次数。 getMaxOccurrences方法可以声明为:public int getMaxOccurrences()。该方法 获得所允许的该模板的最大使用次数。isVariable方法可以声明为:public boolean isVariable(java.lang.String name)。该方法检查模板是否具有给定名称 的变量。其返回旗标来指示模板是否具有给定名称的变量。setParentTemplate 方法可以声明为:public void setParentTemplate(XSTtemplate templ)。该方法设 置该模板的父模板。setVariable方法可以声明为:public boolean setVariable (java.lang.String name,java.lang.Object value)。该方法设置该模板中变量的内 容。setVariable方法可以声明为:public boolean setVariable(java.lang.String name,java.lang.Object value,boolean check)。该方法设置该模板中变量的内 容。在其参数列表中:name是变量名;value是要被设置的变量的内容;和 check是指示应该被首先检查的变量的内容。Write方法可以声明为:public void write(java.io.OutputStream os)throws java.io.IO exception。该方法将该模 板的转换内容写入OutputStream(输出流)中。
在第一实施例中使用的模板使用简单的规则有效地转换文档。然而,其 依赖于模式附件框架来支持逻辑操作和调用Java扩展函数,这降低了性能并 且增加了模板产生的复杂程度。
第二实施例使用模板中一些熟悉的XSLT句法。其建立逻辑操作支持和 向模板语言的Java扩展。该特性使XST执行复杂的转换。在下面显示了使用 第二实施例的XSLT样式句法的模板。


  Beginning of the template for Root
  
  
  End of the template for Root


在该样品中,属性“name”用于指定模板名。“Boing”和“Node2”是局部 变量,并且它们的内容将自动发送到被转换的文档中。模板可以具有全局和 局部变量。局部变量可以自动发送到输出文档。
在下面的模板中,“myVar”是全局变量,其可以在下面的模板内容中引 用。元素“Node22”是局部变量。其值是全局变量“myVar”的内容。
xmlns:xst=″http://www commerceone com/XST″version=″10″>



  Beginning of the template for Root
  
  
  
  End of the template for Root



  


单一模板源用于在转换中使用的所有模板。模板源应该以元素 开始。在上面的样品中源的名称是“SimpleTransform”。在上 面的源代码中有两个模板,即Root和Node1。一旦加载,在模板源中所有模 板将存储在存储器中以便快速访问。在转换期间将提供接口来在额外的模板 中传送。
在源流化期间通过在模板的属性中指定DOM的根节点,可以对源文档 的片断或部分产生DOM。可以使用XPath表示或树操作来访问DOM。

......

  

......

在上面的例子中,属性“domsrc”为DOM源在输入文档中定义根节点。将 使用该属性作为所产生的DOM名,用于其它模板来访问它。属性“dom”指 定将在模板中使用的DOM名。一旦产生,DOM对于在转换中使用的所有模 板是可访问的。
下面是重复使用在先前的例子中由模板产生的DOM的模板。

 ..

  

 ...

在第二实施例中支持逻辑操作“if”和“choose”。



在该实例中,测试是在叶节点“ContactName”上。如果测试不在叶节点上, 则必须使用有效的XPath表示,并且用于XPath的上下文节点/DOM应该是 有效的。

 ....


 


......

还支持逻辑操作。元素具有子元素





   
   


元素可以具有多个子元素来支持多个选项。








No UOMCoded Info


仅仅最后的子元素不具有属性“test”。
在第二实施例中支持下面的内建函数。字符串函数:


连接函数


字符串长度函数

子字符串函数

在上面的模板中,给定变量$Address=”19191 Valco Parkway,Cupertino”, 对于变量“StreetAdress”从子字符串函数返回的值是“19191 Valco Parkway”。 还可以支持由XSLT支持的额外的内建函数,诸如加(+)、减(-)、乘(*)、 除(div)等。
通过使用名称空间/前缀“java”,可以像内建函数那样使用Java扩展函 数。

  ..


.....

在模板中使用的用来调用Java扩展函数的参数数量应该匹配Java扩展函数的 参数数量
<!--Global variables using built-in functions-->



Beginning of the template for Root
<!--Modify global variables-->

 




<!--Modify again the global variable-->

 

在图15A中可以找到每个XST元素的模式。在图15A中,可以确定用 于元素属性的属性值(需要的或选择性的)。
XML元素模板是模板源文档的根元素。在上面的议论中并且如下面显示 的那样,其可以具有子注释并包括模板。
version=″1.0″>
This is a sample templates
<!-First template-->





select=”$Node2”/>


<!-Second template-->




在该样品中,元素val-of用于的内容,而var和val-of用于元素 的内容。将在下面讨论这些使用。
元素模板在模板的范围/有效期中提供用于转换的规则。其还为目标/转换 的文档提供布局。由于元素在源文档中匹配,在startElement的SAX事件激 活或加载模板,并且在endElement的SAX事件对相同的元素卸载模板。如 果可能,XST在endElement的事件上尝试发送模板的转换的内容。模板元素 的句法是:
 match=”element name to match”
 namespace=”namespace to match”
 copy=”true|false”
 deferred=”true|false”
 inclusive=”true|false”
 alias=”name only used when attribute copy is ture and inclusive is false”
 domsrc=”name of the root element for the com”
 skip=”list of elements to be skiped”
 paiam=”list of elements to be saved”
 friend=”id(reserved for future use)”
>

在该句法中,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用于将所选的内容发送到目标文档。
 select=”select expression”
 dom=”dom id”
 disable-output-escaping=”yes|false”

使用有效地XPath表示可以初始化元素val-of。
下面的表示可以用作属性select的值。Param指的是模板的局部参数。例 如。Variable是可变变量。例如 。内建函数包括上述那些XST内建函数。例如 。Java extension是Java扩展函数。 其必须包括由“:”分隔的类路径和方法名。例如。 XPath/DOM是使用DOM的有效Xpath表示。例如。属性dom用 于为select/XPath表示指定DOM源。
属性disable-output-escaping用于禁止转义下面的字符、<、>和&。默认 是分别将这些字符转义为<;>和&。
元素var用于在XST中定义/声明变量。变量在XST中是可变的。对于 模板变量可以使全局或局部变量。作为模板的直接子元素的所有变量是全局 变量并且对于多有模板是可访问的。
 name=”id”
 select=”select expression”
 dom=”dom id”

使用有效的XPath表示可以初始化元素。属性dom可以用于指定DOM 作为select/XPath表示的源。用于元素val-of的相同表示组可以用于元素var。
下面的代码引用说明了上述表示
version=″10″>

<!--Global variables using built-in functions-->



<!-Use global variables-->


<!--Modify global variables using built-in functions-->








<!--Modify again global variables-->





<!--Use a param-->

select=”$Node2”/>




在下面的几个例子中,使用下面的XML源输入:

 
  This is Node 1

 
 This is Node 2

使用上述模板转换的该XML源输入产生下列输出:

This is a global variable
25
This is a global variable-modified
1255
This is a global variable-modified-
agam

This is Node 2
This is Node 1
This is Node 2
**This is Node 2**

下面是使用DOM属性的样品模板:
version=″10″>

<!--Bind template Node1 for DOM creation-->


<!--DOM/XPath The DOM is created in template Node1-->


attribute>


<!-Template used only to create the DOM-->


在模板Node1中产生在上面模板Root中使用的DOM。使用该模板的输 出文档的上面的源文档是:

This is Node 11
dingo-1.1
false

当模板attribute match匹配源文档中的元素名时,元素bind-template用于 激活或连接模板。当模板属性copy是假时,这才是必要的。当copy是真时, 只要子模板匹配源文档中的元素,模板可以在其范围内连接/加载任何模板。 由于匹配并激活模板的句法是
下面的模板:
version=″10″>

Beginning of the template for Root


<!--Bind/load template Node1-->




End of the template for Root


Beginning of the template for Node1


End of the template for Node 1


应用到上面的源输入,产生下面的输出:
Beginning of template for Root


Beginning of template for Node1
This is Node 1End of template for Node1

This is Node 2

End of the template for Root
元素attribute用于向用户定义的元素添加/附加属性。其句法是:
 name=”id”
 select=”select expression”

与元素val-of和var相似,select表示是有效的XPath表示。
下面的模板
version=″1.0″>




<!--Attribute using a variable-->

<!--Attribute usinga built-in function-->

<!--Attribute using a param-->






当应用到上面的源输入时,产生下面的输出:


This is Node 2


元素if、choose、when和otherwise用于在XST中提供逻辑操作。有效 的XPath表示可以用于“测试表示”,也就是属性test的值。它们的句法为:

 ..


 
  ..
 
 
  ...   
 
 
  ...
 
  ... 
 <!-The last otherwise in the logical construct should not have a test expression-->
 
   . 
 


下面的模板:
xmlns:xst=″http://www.commerceone.com/XST″version=″1.0″>





   Node2=″This is Node
2″



   Has a variable-$Node2


   Does not has a variable-
$Node2



   
This is Node 1
   
   
This is Node 2
   
   
This is Node 3
   
   
This is Node x
   





应用到上面的源输入,产生下列输出

This is Node 2
Node2=″This is Node 2″
Has a variable-$Node2
This is Node 2

元素comment用于将注释添加到目标文档上。其可以是任何模板元素的 子元素。其句法为:

 content of the comments

当对于模板元素bind-template、load-template和redirect动作失败时,元 素fall-back用于提供机会来使应用处理错误事件或调试信息。


 
   Fail to load templateselect=”$templateName”/>
 
 ..
 
如果不能加载指定的模板,将消息(message)发送到由应用提供的错误处理 器或目标文档。
元素for-each用于在DOM或为输入文档的片断或子部分产生的其它树结 构中循环一组节点。其句法为:

 ....

下面的模板:
version=″10″>



 -select=″.″/>




当应用到下面的源输入时:




8001


8002




产生下面的输出

ItemDetail-8001
ItemDetail-8002

元素include用于包括在模板源中存储的额外模板。由应用提供的 URIResolver用于解析所包括的源的uri。其句法为
元素loaded-template用于在存储器中动态激活或加载模板,作为正在输 出的执行中的模板的内容。加载模板可以将属性传送到所加载的模板。这些 属性不需要在所加载的模板中声明。所加载的模板可以访问包括局部变量和 属性的加载模板的运行时间上下文。其句法为:

 
 
...

根据第二实施例,下面的样品“模板”包括一对“模板”元素:
version=″1.0″>





tempate Node1 is not null′)″/>








在上面的样品中,模板“loaded”由模板“root”加载。在下面显示了在 加载后等效的模板。
version=″10″>










元素message用于自定义的消息。其句法为消息内容
元素redirect用于将内容的一部分重定向到特定的目标。其句法为:

<!-Content to be redirected-->

下面是使用redirect的样品模板
version=″1.0″>

...


select=param(AddAdditionalItems)”/>


...


有效的XPath表示可以用于属性eref的值
version=″10″>


...


  select=param(AddAdditionalItems)”/>


...


实体参考eref应该由应用提供的URIResolver进行解析,并且返回的应该是 可以管理/关闭所打开的、用于“redirect”的Result对象的com.commerceone. xst.swi.jaxp.ResultManager的对象。
在某些实施例中,支持转换的流和缓冲模式。在流模式转换中,根模板 处于复制模式。当输出数据有效时,XST流出转换的内容的小型缓冲器。在 加载或激活子模板之前,父模板将其转换的内容流出来清除其子模板的流路 径。在卸载或去激活模板之前,模板将其转换的内容流出来清除其同属模板 的流路径。在缓冲模式转换中,根模板不处于复制模式。XST不流出转换的 内容。在卸载模板之前,如果其父模板处于复制模式,则其将模板的转换的 内容附加到其父模板。
当在该时刻转换所需的信息不可用时,使用延迟模式的模板。其提供小 于整个转换的缓冲。延迟模式在模板处理期间暂停流的默认行为。延迟模式 模板向其父模板注册而不是流出其内容。由于整个转换实际上是延迟的,所 以延迟模式在缓冲式转换中是无效的。模板规则的一个实施例允许模板仅延 迟一个注册的子模板。在一个实施例中,如果有注册的子模板,则父模板流 出先前注册的子模板的任何转换的内容,并且在其注册新的子模板之前流出 其自身的内容。
在第一实施例中,使用伪模板可以实现要求的流。在startElement或 endElement的SAX事件完成模板的转换内容的流。通过添加伪模板,我们可 以引入额外的SAX事件来降低存储器中转换的内容,这将导致增加转换的速 度。
尽管已参照上述本发明的优选实例表示和描述了本发明,但应该理解的 是,这些例子用于说明而不是限定。在描述的实施例中牵涉到计算机辅助处 理。因此,可以以计算机辅助处理方法、包含逻辑来实现转换处理的系统、 施加实现转换处理的逻辑的媒体、施加实现转换处理的逻辑的数据流或计算 机可访问的转换处理服务来实现本发明。对于本领域技术人员来说修改和组 合是显而易见的,可在不背离由所附权利要求书限定的本发明宗旨和范围的 前提下对本发明进行各种形式和细节上的修改。
版权声明
本专利文档的公开中的一部分包含受版权保护的材料。只有专利文档或 专利公开的任何一个副本出现在专利或商标局专利文件或记录中,版权所有 者对其没有异议,否则无论任何情况下都保留所有版权权利。
高效检索全球专利

IPRDB是专利检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,专利查询、专利分析

电话:13651749426

侵权分析

IPRDB的侵权分析产品是IPRDB结合多位一线专利维权律师和专利侵权分析师的智慧,开发出来的一款特色产品,也是市面上唯一一款帮助企业研发人员、科研工作者、专利律师、专利分析师快速定位侵权分析的产品,极大的减少了用户重复工作量,提升工作效率,降低无效或侵权分析的准入门槛。

立即试用