Xml 导入后限制xsd字符串

Xml 导入后限制xsd字符串,xml,types,xsd,abstract,simpletype,Xml,Types,Xsd,Abstract,Simpletype,假设我有一个basic.xsd文件,将某个元素myElement中的某个属性定义为xsd:string 现在我想在我的special.xsd中导入这个basic.xsd,并使myAttribute的定义更加严格,只允许值a或b。anotherSpecial.xsd的其他一些实现者可能希望将可能的值限制为lorem和ipsum 如何做到这一点?我可以将属性抽象化吗?属性或元素不能“重新定义”;因此,您必须确保您的属性是全局定义的简单类型;无论该属性是否为全局属性,都不会产生任何影响。与元素不同,属

假设我有一个
basic.xsd
文件,将某个元素
myElement
中的某个属性定义为
xsd:string

现在我想在我的
special.xsd
中导入这个
basic.xsd
,并使
myAttribute
的定义更加严格,只允许值
a
b
anotherSpecial.xsd
的其他一些实现者可能希望将可能的值限制为
lorem
ipsum


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

属性或元素不能“重新定义”;因此,您必须确保您的属性是全局定义的简单类型;无论该属性是否为全局属性,都不会产生任何影响。与元素不同,属性不能标记为抽象

我将直截了当地说,您希望更改与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>

髓鞘1
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值更改为,它就可以工作了

如果使用此XSD的人对重定义(例如将XSD绑定到代码的工具)有问题,那么我将研究一种XML模式重构工具,它可以接受您的special.XSD并自动转换为其等效格式,而无需XSD:redefinite。实际上,您要做的是将special.xsd中的“智能属性”与basic.xsd分开;虽然可以自动维护对basic.xsd的更改,并使其对special.xsd的使用者可见,而无需反复“重新编码”xsd