想象一下,我有一个basic.xsd
文件,其中某些元素myElement
中的某些属性myAttribute
定义为xsd:string
。现在导入后限制xsd字符串
我想导入此basic.xsd
在我special.xsd
并作出myAttribute
定义严格,只允许值a
或b
。 anotherSpecial.xsd
的其他实施者可能想要将可能的值限制为lorem
和ipsum
。
这怎么办?我可以使属性抽象吗?
想象一下,我有一个basic.xsd
文件,其中某些元素myElement
中的某些属性myAttribute
定义为xsd:string
。现在导入后限制xsd字符串
我想导入此basic.xsd
在我special.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>
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 ...