XSLT-增量计算组件 (DCC) 技术描述和使用方法





0/5 (0投票)
本文提供了一个可重用的组件,用于计算两个 XML 结构之间的差异。它通过 XSLT 实现,速度更快且平台无关。
描述
本文介绍了一个“Delta 计算组件”(为简洁起见,称为 DCC),它使用 XSLT 实现提供了 XML 文档的差异计算逻辑。
DCC 以 XML 文档作为输入。该 XML 文档包含两个不同的部分。这些部分代表了两个不同的 XML 结构。DCC 运行差异计算逻辑来提取这两个部分之间的更改。DCC 组件的结果以一个 XML 部分呈现,其中包含输入部分之间的合并更改(相似之处被忽略)。输出包括用于标记删除、添加和更新的元素的标志,这些元素根据输入文件进行标记。这些标志的值可以在组件的配置文件中进行配置。
输入 XML 文档包含第一部分,称为“AS IS”结构,以及第二部分,称为“TO BE”结构。这两部分由相同的父元素名称(由用户定义/配置的元素名称)单独包装。输入文件的示例和更详细的描述将在后续章节中展示。
DCC 在 XSLT 语言中的实现是通过一个包含用户定义的某些配置的 `configuration.xml` 文件来比较这两个部分。XSLT 语言比其他可以提供相同逻辑的编程语言更快,这积极地影响了用户应用程序的性能。结果在一个由 `DeltaCalculationOutputWrapper
` XML 元素包装的部分中构建。该部分包含输入部分元素之间的差异。根据“AS IS-TO BE”的更改,标志(action 属性)会附加到 XML 元素上。更改可能包括:从“AS IS”中删除的元素,添加到“TO BE”的元素,以及在“AS IS”和“TO BE”之间更改的元素。ASIS 和 TOBE 元素的识别验证取决于为每个输入元素定义的primary attribute。
DCC 功能详解
在图 1 中,输入包含在同一个“ABC”父元素下的两个“structure”元素。这两个“structure”元素将被 DCC 组件用于差异计算。在每个“structure”组件下,都有 books 元素(根据用户输入文件,也可以是其他任何内容)。将对这些下属元素进行评估。如稍后所述,每个元素都有一个primary attribute键。例如,在 book 的情况下,“book_name
”是primary key,因此 books 元素将通过此属性值进行比较。每个元素的primary key由用户定义。如果某个元素用户没有定义primary key,则ASIS中的任何元素都将与TOBE中具有相同层级的相同元素匹配,即使它们具有其他不同的详细信息(其他不同的属性)。
在执行完该逻辑以匹配两个独立的“structure”元素中的元素后,DCC 会定义已添加或删除的元素。任何具有已添加或删除子元素的父元素都将被视为已更新。
没有更新的相似元素将在生成的输出中不存在,DCC 只显示更改。
根据图 1,DCC 将在其输出中提及以下内容:
- “Pascal Language”这本书被移除,及其所有子元素。
- “C++ Language”这本书被添加,及其所有子元素。
- “Java Language”这本书被更新,其中添加了“Java_New_Author”并移除了“Java_Old_Author”(“Java_Author”将完全不被提及,其本身或其子项都没有发生变化)。
DCC 架构
如图 2 所示,DCC 包含 3 种类型的构件:
- 黄色块:用户定义的输入文件和生成的输出文件。
- 绿色块:用户暴露的构件。它们是配置文件和 DCC 入口 XSL 文件。
- 红色块:DCC 内部构件,包含差异计算逻辑。用户不应触碰这些文件。
输入 XML 文件是用户定义的输入文件。如图 1 所示,输入文件包含两个“structure”元素。“structure”元素(稍后将进行描述)是输入“ASIS”和“TOBE”部分的包装器。在此元素下,结构遵循用户特定的问题。此外,该元素外部的元素超出了差异计算逻辑的范围。图 1 中“DEF
”元素就是此类外部元素的示例。
Out_XXX XML 文件(其中 XXX 是输入文件的名称)是生成的输出文件。如图 3 所示,它包含“DeltaCalculationOutputWrapper
”元素。在此元素下,将出现已更改/添加/删除的元素。任何相似的输入都不会显示在输出中。任何添加的元素都将被标记为已添加,任何删除的元素都将被标记为已删除。在这两种情况下,所有前置元素都将被标记为已更新。如图 3 所示,至少有一个已添加或已删除作者的书籍被视为已更新的书籍。
DCC_EntryPoint XSL 文件是 DCC 的入口点。用户应在设置输入文件路径后调用此 XSL 文件。此调用可以通过实现(例如 Java 实现)或使用“Altova XML spy”之类的工具来管理。用户无需对该文件做任何操作,只需调用它。
DCC_Configuration XML 文件是一个配置文件,需要用户给予一定的关注。用户在此定义许多内容,如下所示:
- “
DC-ComparedElement
”是定义输入包装器元素名称的入口(在我们示例场景中为“structure
”)。 - “
Component
”,在此用户定义所有需要比较的组件。在每个“component
”元素中,用户应提供信息:与用户问题相关的元素名称,以及该元素的属性,该属性将用于判断两个元素是否相同。此“primarykey
”元素类似于数据库中的 primary key,用于区分行。 - “
DC-UpdatedElement
”是用户可以定义的用于标记输出文件中已更新元素的标志。 - “
DC-RemovedElement
”是用户可以定义的用于标记输出文件中已删除元素的标志。 - “
DC-AddedElement
”是用户可以定义的用于标记输出文件中已添加元素的标志。
DCC_Delta_Calculation_Logic XSL 文件是一个内部 XSL 文件,包含计算所需的逻辑。用户不应修改此文件。
DCC_Utility XSL 文件是一个内部 XSL 文件,包含计算所需的实用逻辑。用户不应修改此文件。
无需用户界面即可开始使用 DCC
当您希望在应用程序内部使用该组件时,应遵循以下步骤:
- 根据您的输入架构配置“DCC_Configuration.xml”文件,如本文前面所述。
- 将所有 DCC 文件(XSL 和配置文件 XML)放在同一个目录中。
- 使用您的实现直接调用“DCC_EntryPoint.xsl”文件,并附带输入文件(无需指定模板调用)。
- 查找调用的输出;即差异计算逻辑的输出。
开始使用 DCC 和用户界面
在图 5 中,这是运行差异计算组件 jar 后出现的第一个表单。此表单由三个字段组成,第一个是 XSLT 文件路径,应包含 `DCC_EntryPoint.xslt` 文件的正确路径;第二个字段应包含输入文件的正确路径;第三个字段包含您希望包含输出文件的文件夹路径。
图 6,此表单包含已填写正确路径的三个字段。
填写正确的路径并点击开始按钮后,差异计算开始工作,然后会弹出一个成功的消息框。现在生成的文件的检查已准备就绪。
如果使用了不正确的输入,将弹出一个错误消息框,其中包含描述错误的消息(如图 8 所示)。
如图 9 所示,如果点击开始按钮,但某个路径未填写,将弹出一个消息框要求填写。
DCC 兼容性
DCC 组件显然适用于需要使用 XSLT 实现此功能的中间件应用程序。差异计算逻辑很容易使用任何面向对象/结构化编程语言实现,但这里真正新颖的想法是使用 XSLT 语言实现如此复杂的逻辑,它比任何普通编程语言(Java、.NET……)都提供更好的性能。
虽然 DCC 非常适合中间件应用,但它也可以用于桌面、Web 和企业应用程序(前提是该应用程序具有执行 XSLT 语言所需的库,如 Saxon jar)。
DCC 的 GUI 部分(jar 文件)可供任何非技术用户使用,通过 GUI 界面并借助配置文件获得相同的逻辑服务。