想象一下,我有basic.xsd
个文件在某个元素myAttribute
中定义某个属性myElement
为xsd:string
。
现在,我想在basic.xsd
中导入此special.xsd
,并使myAttribute
的定义更严格,只允许值a
或b
。 anotherSpecial.xsd
的其他一些实施者可能希望将可能的值限制为lorem
和ipsum
。
如何做到这一点?我可以将属性设为抽象吗?
答案 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 ...