使用自定义XSD基于公共XSD扩展XML

时间:2015-08-12 14:48:18

标签: xml xsd xsd-validation

我开始认为这很简单,但我被困了:

我想基于公开的XSD编写/读取XML文件,其中包含一些我想在自己的XSD中定义的额外元素。 XML主要应该如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>

<PublicRoot xmlns="http://public.com/PublicSchema" xmlns:own="http://myown.com/OwnSchema">
    <PublicA>
        <PublicB PublicAttrib1="1">
            <!-- I only want own:OwnA to validate OK here, inside the PublicB element: -->
            <own:OwnA OwnAttrib1="My own attribute" />
        </PublicB>
        <own:OwnA OwnAttrib1="My own attribute" /> <!-- Should FAIL validation -->
    </PublicA>
    <own:OwnA OwnAttrib1="My own attribute" /> <!-- Should FAIL validation -->
</PublicRoot>

当然,公共模式允许来自其元素内的其他模式的额外元素 - 以下是PublicSchema中所有元素的一部分:

<xs:any namespace="##other" processContents="lax" minOccurs="0"/>

这意味着除了PublicSchema XSD之外,上面的XML示例使用以下OwnSchema XSD完全验证:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
    targetNamespace="http://myown.com/OwnSchema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="OwnA">
        <xs:complexType>
            <xs:attribute name="OwnAttrib1" type="xs:string" />
        </xs:complexType>
    </xs:element>

</xs:schema>

我的问题是,我想创建一个不验证正确格式化的Own元素的XSD,该元素放置在Public节点树中的其他位置,而不是我想要的(在上面的例子中,只有own:OwnA元素)作为PublicB元素的子元素放置应该是有效的。)

我考虑过重新定义或扩展PublicB元素的类型,但这似乎意味着篡改PublicSchema,我不应该触及。

我是在尝试做一些不合逻辑或不可能的事情,还是可以解决这个问题?

0 个答案:

没有答案