2012-11-21 166 views
4

继此tutorial我将我的733行模式重构为16个独立的文件或子模式,每个文件或子模式都有其自己的命名空间。现在顶级模式只有77行。计划是使用这些子模式构建其他顶级模式。使用XSLT自动生成XML模式

问题是,大多数顶级模式都非常相似,只是在一些低级别的细节上有所不同。例如,当一个顶级架构支持全部PaymentMethodType(参见tutorial)时,另一个顶级架构可能仅支持VISA和MasterCard。目前,我创建顶级模式的方法涉及相当多的重复。例如,我目前创建支持VISA和MasterCard的顶级架构的方法将涉及重复Main.xsdOrderType.xsd,但是定制CommonTypes.xsd并重新使用CustomerTypes.xsd。 (因为我的实际模式更长,所涉及的重复次数更多。)

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

我想知道的是,如果有一种方法不通过某种类型的配置文件(XSLT或许?)自动生成模式,以避免重复子模式。

而且,是它所有的子模式来声明相同的目标命名空间在此情况下(就像XML架构命名空间xs很好的做法,但定制子模式声明不同的命名空间?

+0

我已经充分考虑了这种情况,但从来没有设计出这样的优雅方法。请关注此线程。 –

+0

在这种情况下,您可能还需要关注以下主题: http://www.oxygenxml.com/pipermail/oxygen-user/2012-November/004455.html – Olumide

回答

-1

我我不打算描述一种基于XSLT的方法,因为我没有意识到任何好的方法,并且因为我在开发中看到你自己的摇摆:“某种类型(XSLT也许?)”

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

总有一种可能性,因为你想要的实际上很简单,因此可以采用滚动式自己的XSLT,否则在经济上或智力上是可行的。为您的问题分享更具体的参数可能有助于产生更好的答案。尽管如此,如果您正在考虑以专业的方式进行这项工作,即对您的输入和输出XSD的外观做出最小假设,那么您需要做一些工作。

我最终做的是为XML Schema重构设计一个Domain Specific Language。它可作为QTAssistant XSR模块的一部分。 从图形上看,这就是你的“733行模式到16个独立的文件或子模式”在QTAssistant中的样子。

enter image description here

它的重构功能,让很多人都从单一来源组描述的东西。所有你需要做的就是配置你需要的“视图”和任何需要的功能(例如,什么在XSD文件中,自动拉入所需的依赖关系,更改目标命名空间,重构类型名称,元素,替换基类型删除不需要的粒子,引入顺序包装以改变基数等)。按钮推送可以保证有效的XSD文件。它还带有一个命令行界面,用于与自动构建系统集成。

如果有什么,我会考虑看看一个API,如在。NET的Schema包,如果仅仅是为了获得在XSLT模板可以或许如何设计灵感......

0

你为什么要复制Main.xsdOrderType.xsd不是重用他们为你做CustomerTypes.xsd的?如果它们字面上相同(如“重复”意味着),为什么不直接导入它们呢?我猜你可能会忽略一些问题...

此外,似乎有一个词在“没有通过生成架构”中缺失。

  1. 为每个子模式使用不同的命名空间;另一种方法是“变色龙模式”。这就是子模式本身没有名称空间的地方,但是需要使用顶层模式的名称空间。 Multi-Schema Project: Zero, One, or Many Namespaces?。但是,这种技术有点棘手,并不是所有的工具都支持它,所以一些suggest avoiding it。但对于你的情况,也许这是值得的......当然,阅读这些链接会给你如何处理你的情况的想法。

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

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

如果不是这样,那么使用XSLT(或其他XML /文本处理工具)组装子模式的想法就可行。如果您希望获得有关XSLT的特定帮助,我建议您包含您开始的模式样本以及所需的结果模式。