2011-12-10 39 views
0

想象一下,我有一个basic.xsd文件,其中某些元素myElement中的某些属性myAttribute定义为xsd:string。现在导入后限制xsd字符串

我想导入此basic.xsd在我special.xsd并作出myAttribute定义严格,只允许值abanotherSpecial.xsd的其他实施者可能想要将可能的值限制为loremipsum

这怎么办?我可以使属性抽象吗?

回答

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 ...