想象一下,我有一個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 ...