如何让XSD元素在不知道具体元素的情况下接受特定类型的子元素?

时间:2017-03-11 22:08:27

标签: xml xsd

所以我正在开发一个工作项目,我们正在定义一些灵活的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中的元素扩展该类型。

我们将不胜感激。谢谢。

2 个答案:

答案 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