在tutorial之后,我将我的733行模式重构为16个独立的文件或子模式,每个文件或子模式都有自己的命名空间。现在顶级架构只有77行。计划是使用这些子模式来构建其他顶级模式。
问题在于大多数顶级架构非常相似,只是在一些低级细节上有所不同。例如,当一个顶级架构支持所有PaymentMethodType
时(参见tutorial),另一个顶级架构可能仅支持VISA和MasterCard。目前,我创建顶级模式的方法涉及到相当多的重复。例如,我目前创建仅支持VISA和MasterCard的顶级模式的方法将涉及重复Main.xsd
和OrderType.xsd
,但需要自定义CommonTypes.xsd
并重用CustomerTypes.xsd
。 (因为我的实际架构要长得多,所以需要更多的重复。)
我发现这种重复不可接受主要是因为它引入了维护挑战,即我必须维护任意数量的具有不同名称的相同子模式。
我想知道的是,是否有一种方法可以自动生成模式而无需通过某种类型的配置文件(可能是XSLT?),以避免重复子模式。
此外,在这种情况下,所有子模式都声明相同的目标名称空间是好的做法(就像xml架构名称空间xs
一样,但是自定义子模式是否声明了一个单独的名称空间?
答案 0 :(得分:0)
为什么要重复Main.xsd
和OrderType.xsd
而不是像CustomerTypes.xsd
一样重复使用它们?如果它们在字面上完全相同(如“重复”所暗示的那样),为什么不直接导入它们呢?我猜你可能会从问题中省略一些内容......
此外,“生成没有通过的架构”似乎缺少一个词。
为每个子架构设置不同的命名空间将起作用;另一种方法是“变色龙图式”。这是子模式本身没有命名空间的地方,但是采用顶层模式的命名空间。 Multi-Schema Project: Zero, One, or Many Namespaces?。但是,这种技术有点棘手,并非所有工具都支持它,因此有些suggest avoiding it。但是对于你的情况,也许这是值得的......当然,阅读这些链接会给你如何处理你的情况的想法。
您可以redefine另一个架构的特定部分(该架构的其余部分保持不变)。看看example below the defintion。这听起来像完全解决您的问题。重新定义的部分可以是低级的,由模式的其他部分(或其他导入的模式)使用。但是,与上面的(1)一样,这是规范中棘手的部分,有些工具可能不支持。
所以...希望你的工具实现规范的这些功能(以及任何需要使用它们的人的工具)。您可以使用上面链接中的示例对其进行测试(我确认它适用于xmllint)。
如果没有,您使用XSLT(或其他XML /文本处理工具)组装子模式的想法是可行的。如果您需要XSLT的特定帮助,我建议您包含您开始使用的模式的示例,以及您想要的结果模式。
答案 1 :(得分:-1)
我不会描述基于XSLT的方法,因为我不知道任何好的方法,因为我在你自己的摇摆中看到的开放:“某种类型(也许是XSLT?)”。
你想要的东西我在2004年试过了;我已经放弃了XSLT作为处理XML Schema Refactoring的语言,因为我认为模式对象模型API(SOM / XSOM) - 专为XSD分析和创建而设计的API - 对我的使用效率更高。时间(对于XSLT权威读者来说,我已经对我的陈述进行了限定)。
总有一种可能性,你想要的东西实际上很简单,因此滚动你自己的XSLT或其他方面是可行的(经济上或智力上)。为您的问题分享更具体的参数可能有助于产生更好的答案。尽管如此,如果您正在考虑以专业方式进行此操作,即对输入和输出XSD的外观进行最小限度的假设,那么您需要做一些工作。
我最终做的是为XML Schema Refactoring设计Domain Specific Language。它作为QTAssistant XSR模块的一部分提供。 从图形上看,这就是你的“733行模式分为16个独立文件或子模式”在QTAssistant中的样子。
它的重构功能允许您从单个源集中描述的许多内容。您需要做的就是使用所需的任何功能配置所需的“视图”(例如XSD文件中的内容,自动引入所需的依赖项,更改目标名称空间,类型的重构名称,元素,替换基类型删除不需要的粒子,引入序列包装器来改变基数等。按钮推送可以保证有效的XSD文件。它还带有一个命令行界面,用于与自动构建系统集成。
如果有的话,我会考虑使用.NET的Schema包中的API,如果只是为了获得可能如何设计XSLT模板的灵感......