导入后限制xsd字符串

时间:2011-12-10 11:57:40

标签: xml types xsd abstract simpletype

想象一下,我有basic.xsd个文件在某个元素myAttribute中定义某个属性myElementxsd:string

现在,我想在basic.xsd中导入此special.xsd,并使myAttribute的定义更严格,只允许值abanotherSpecial.xsd的其他一些实施者可能希望将可能的值限制为loremipsum

如何做到这一点?我可以将属性设为抽象吗?

1 个答案:

答案 0 :(得分:2)

属性或元素不能“重新定义”;所以你必须确保你的属性是一个全局定义的简单类型;无论属性是否为全局属性,它都没有区别。与元素不同,属性不能标记为抽象。

我将从字面上理解你想要更改与basic.xsd中的元素关联的属性的值域,而不是其他任何内容。我就是这样做的:

basic.xsd

<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)-->
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="myElement">
        <xsd:complexType>
            <xsd:simpleContent>
                <xsd:extension base="xsd:string">
                    <xsd:attribute name="myAttribute" type="tmyAttribute"/>
                </xsd:extension>
            </xsd:simpleContent>
        </xsd:complexType>
    </xsd:element>  

    <xsd:simpleType name="tmyAttribute">
        <xsd:restriction base="xsd:string"/>
    </xsd:simpleType>
</xsd:schema>

有效样本XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<myElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" myAttribute="myAttribute1" xmlns="http://tempuri.org/XMLSchema.xsd">myElement1</myElement>

special.xsd

<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)-->
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:redefine schemaLocation="basic.xsd">
        <xsd:simpleType name="tmyAttribute">
            <xsd:restriction base="tmyAttribute">
                <xsd:enumeration value="a"/>
                <xsd:enumeration value="b"/>
            </xsd:restriction>
        </xsd:simpleType>       
    </xsd:redefine>
</xsd:schema>

在对special.xsd进行验证时,上述XML现在无效;将示例XML中的myAttribute属性值更改为a,它将起作用。

如果使用此XSD的人在重新定义时出现问题,例如将XSD绑定到代码的工具,然后我会看一个XML Schema重构工具,它可以将你的special.xsd自动转换为它的等效格式,而不需要xsd:redefine。你实际上要做的是保持special.xsd中的“知识产权”与basic.xsd分开;虽然可以自动维护对basic.xsd的更改并使其对special.xsd的使用者可见,而无需一遍又一遍地“重新编码”XSD ...