所以我正在做一个项目,我们定义了一些灵活的XSD模式。我们的想法是使用XML为我们的应用程序中的某些框架传递执行指令。我们将在此基础上构建的各种执行任务的核心结构将位于一个核心架构中,该架构将被实现架构引用。
在我的核心模式中,我有包装器类型。这些类型在实现架构中进行了扩展,这允许实现架构中的元素将核心架构中的元素作为其子元素。
问题是,我需要反面也是正确的。我需要核心模式中的元素能够将实现模式中的元素也作为它们的子元素。下面是我要做的XML的一个例子:
<http:Execution>
<core:Condition>
<core:If test="ognl:'One-Response'.equals(#value)">
<http:POST url="http://localhost:9000/eip/http-post/second" auth="BasicAuth" />
</core:If>
</core:Condition>
</http:Execution>在该示例中," core“名称空间是我的核心模式,"http”名称空间是实现模式。
Execute扩展了"extendedWrapperType",它可以毫无问题地接受核心元素core:Condition。core:Condition接受子core:If,因为它是在core模式中定义的。但是,core:If不能接受http:POST作为其子元素,因为在核心模式中,它不是被设计为接受它的。
我希望避免使用xs:any,但如果其他方法都失败了,这将是我的退路。我真的希望有一种方法可以让核心XSD中的元素包含一个引用,它可以接受我在核心XSD中指定的类型的任何子级,然后让http XSD中的元素扩展该类型。
如果您有想法和帮助,我们将不胜感激。谢谢。
发布于 2017-03-12 09:13:43
这听起来像是替换组的工作。在core schema中,定义一个抽象元素声明,作为core:If的内容出现。在实现架构中,将您的特定元素定义为该替换组的成员。请注意,抽象元素可以有一个类型,而特定元素必须是兼容类型(相同类型或从该类型派生)。
发布于 2017-03-12 07:35:34
如果我没有理解错的话,这是不可能的--您必须循环地将两个模式导入到另一个模式中,这是行不通的。
当然,您可以在核心模式中使用xs:any,但这并不是一种理想的方法。
您可以考虑定义某种类型的core操作复杂类型(可能会在您的实现模式中进一步限制/扩展)。因此,不是这样:
<http:Execution>
<core:Condition>
<core:If test="ognl:'One-Response'.equals(#value)">
<http:POST url="http://localhost:9000/eip/http-post/second" auth="BasicAuth" />
</core:If>
</core:Condition>
</http:Execution>你会有像这样的东西
<http:Execution>
<core:Condition>
<core:If test="ognl:'One-Response'.equals(#value)">
<core:Action command="POST">
<core:Parameter name="url" value="http://localhost:9000/eip/http-post/second" />
<core:Parameter name="auth" value="BasicAuth" />
</core:Action>
</core:If>
</core:Condition>
</http:Execution>您甚至可以考虑去掉core:If,将test属性移到Action。
https://stackoverflow.com/questions/42741240
复制相似问题