4

按照本教程,我将我的 733 行模式重构为 16 个单独的文件或子模式,每个文件或子模式都有自己的命名空间。现在顶级架构只有 77 行。计划是使用这些子模式来构建其他顶级模式。

问题是大多数顶级模式都非常相似,只是在一些低级细节上有所不同。例如,虽然一个顶级架构支持 all PaymentMethodType(请参阅教程),但另一个顶级架构可能仅支持 VISA 和 MasterCard。目前,我创建顶级模式的方法涉及大量重复。例如,我当前创建仅支持 VISA 和 MasterCard 的顶级模式的方法将涉及复制Main.xsdand OrderType.xsd,但要自定义CommonTypes.xsd和重用CustomerTypes.xsd. (由于我的实际架构更长,因此涉及更多重复。)

我发现这种重复是不可接受的,主要是因为它引入了维护挑战,即我必须维护任意数量的具有不同名称的相同子模式。

我想知道的是,是否有一种无需通过某种配置文件(也许是 XSLT?)即可自动生成模式的方法,以避免重复子模式。

此外,在这种情况下,所有子模式声明相同的目标命名空间是否是一种好习惯(就像 xml 模式命名空间一样xs,但自定义子模式声明了单独的命名空间?

4

2 回答 2

0

你为什么要复制Main.xsdOrderType.xsd不是像你一样重用它们CustomerTypes.xsd?如果它们实际上是相同的(正如“重复”所暗示的那样),为什么不直接导入它们呢?我猜你可能会从问题中省略一些东西......

此外,“生成没有通过的模式”中似乎缺少一个词。

  1. 为每个子模式设置不同的命名空间将起作用;另一种方法是“变色龙模式”。这是子模式本身没有命名空间的地方,而是采用顶级模式的命名空间。多模式项目:零个、一个或多个命名空间?. 但是,这种技术有点棘手,并且并非所有工具都支持它,因此有些人建议避免使用它。但是对于您的情况,也许它是值得的……当然,阅读这些链接会给您关于如何处理您的情况的想法。

  2. 您可以重新定义另一个模式的特定部分(该模式的其余部分保持不变)。看看定义下面的例子。听起来这正是您问题的解决方案。重新定义的部分可以是低级的,由模式的其他部分(或其他导入的模式)使用。但是,与上面的 (1) 一样,这是规范的一个棘手部分,某些工具可能不支持。

所以...希望您的工具实现规范的这些功能(以及需要使用它们的任何其他人的工具)。您可以使用上面链接中的示例对其进行测试(我确认它适用于 xmllint)。

如果没有,您使用 XSLT(或其他 XML/文本处理工具)组装子模式的想法会奏效。如果您需要有关 XSLT 的特定帮助,我建议您包括您开始使用的模式示例,以及您想要的结果模式。

于 2012-11-23T09:05:41.807 回答
-1

我不打算描述基于 XSLT 的方法,因为我不知道有什么好的方法,并且因为我在您自己的摇摆不定中看到的开头:“某种(可能是 XSLT?)”。

你想要什么我早在 2004 年就试过了;我已经放弃了将 XSLT 作为一种用于处理 XML 模式重构的语言,因为我认为模式对象模型 API (SOM/XSOM)——专为 XSD 分析和创建而设计的 API——是一种更有效地使用我的时间(对于阅读本文的 XSLT 专家,我已经对我的陈述进行了限定)。

总有一种可能性,即您想要的实际上很简单,因此滚动您自己的 XSLT 或其他方式是可行的(经济上或智力上)。为您的问题分享更具体的参数可能有助于产生更好的答案。不过,如果您正在考虑专业地执行此操作,即对您的输入和输出 XSD 的外观做出最少的假设,那么您需要做一些工作。

我最终做的是为 XML 模式重构设计一种领域特定语言。它作为QTAssistant XSR 模块的一部分提供。从图形上看,这就是 QTAssistant 中“将 733 行模式转换为 16 个单独的文件或子模式”的样子。

在此处输入图像描述

它的重构功能允许您从单个源集中描述的许多内容。您需要做的就是使用所需的任何功能配置所需的“视图”(例如,XSD 文件中的内容,自动拉入所需的依赖项,更改目标命名空间,重构类型、元素的名称,替换基本类型删除不需要的粒子,引入序列包装器以更改基数等)按一下按钮即可保证有效的 XSD 文件。它还带有用于与自动构建系统集成的命令行界面。

如果有的话,我会考虑查看 .NET 的Schema包中的 API,如果只是为了获得关于如何设计 XSLT 模板的灵感......

于 2012-11-22T16:22:34.153 回答