所以我正在开发一个工作项目,我们正在定义一些灵活的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>
在该示例中,“核心”命名空间是我的核心架构,“http”命名空间是实现架构。
http:Execute扩展了“extendedWrapperType”,它可以接受核心元素核心:条件没有问题。 core:Condition接受子核心:如果因为那是在核心模式中定义的。但是,核心:如果不能接受http:POST作为其子元素,因为在核心架构中它不是为了接受它而设计的。
我希望避免使用xs:any,尽管如果其他所有方法都失败了,那将是我的后备。我真的希望有一些方法让核心XSD中的元素包含一个引用,它可以接受我在核心XSD中指定的任何类型的子类,然后让http XSD中的元素扩展该类型。
我们将不胜感激。谢谢。
答案 0 :(得分:1)
这听起来像替代团体的工作。在核心模式中,定义一个抽象元素声明以显示为核心内容:If。在实现模式中,将您的特定元素定义为该替换组的成员。请注意,abstract元素可以具有类型,并且特定元素必须是兼容类型(相同类型或从中派生)。
答案 1 :(得分:0)
如果我理解你是对的,那么就无法完成 - 你必须循环地将两种模式相互导入,这样才能完成。
您当然可以在核心架构中使用employees_db
,但这并不是一种理想的方法。
您可以考虑定义某种c:\employees_db>c:\Path\to\MySql\bin\mysql.exe -u username -p < employees.sql
动作复杂类型(可能在您的实现架构中进一步限制/扩展)。所以,而不是:
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
。