首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在XSD中重用simpleType重定义

如何在XSD中重用simpleType重定义
EN

Stack Overflow用户
提问于 2011-10-10 15:40:53
回答 1查看 7.2K关注 0票数 3

想象一下在definition.xsd中有一个定义的简单类型

代码语言:javascript
复制
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="myType">
        <xs:restriction base="xs:string" />
    </xs:simpleType>
</xs:schema>

然后在两个不同的xsd中使用该类型:use1.xsduse2.xsd

使用1.xsd

代码语言:javascript
复制
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">    
    <xs:include schemaLocation="definition.xsd"></xs:include>    
    <xs:complexType name="ComplexType1">
        <xs:attribute name="typeInstance1" type="myType" use="required" />
    </xs:complexType>
</xs:schema>

使用2.xsd

代码语言:javascript
复制
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">    
    <xs:include schemaLocation="definition.xsd"></xs:include>    
    <xs:complexType name="ComplexType2">
        <xs:attribute name="typeInstance2" type="myType" use="required" />
    </xs:complexType>
</xs:schema>

然后有2个文件particularUse1.xsdparticularUse2.xsd,重新定义了前面的两个xsd:

particularUse1.xsd

代码语言:javascript
复制
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:redefine schemaLocation="use1.xsd">
        <xs:simpleType name="myType">
            <xs:restriction base = "myType">
                <xs:enumeration value = "value1"/>
                <xs:enumeration value = "value2"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:redefine>
</xs:schema>

particularUse2.xsd

代码语言:javascript
复制
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:redefine schemaLocation="use2.xsd">
    <xs:simpleType name="myType">
        <xs:restriction base = "myType">
            <xs:enumeration value = "value1"/>
            <xs:enumeration value = "value2"/>
        </xs:restriction>
    </xs:simpleType>
</xs:redefine>
</xs:schema>

现在的问题是:如何重用myType的重新定义,特别是Use1.xsd和SpeciarUse2.xsd,因为它们是不重复的。

理想情况下,它将是另一个文件reused.xsd

代码语言:javascript
复制
    <xs:simpleType name="myType">
        <xs:restriction base = "myType">
            <xs:enumeration value = "value1"/>
            <xs:enumeration value = "value2"/>
        </xs:restriction>
    </xs:simpleType>

particularUse1.xsdparticularUse2.xsd.中使用来自文件reused.xsd的引用。

EN

回答 1

Stack Overflow用户

发布于 2011-11-03 03:01:23

答案实际上取决于您在XSD文件上设置了哪些约束,它们的使用,以及您将使用什么工具来使用XML文件。此图表显示了问题所描述的文件的布局。

由于您正在重新定义use1.xsd和use2.xsd,所以我假设这两个文件是不可编辑的(通常由其他人发布/维护)。

选项1

一种方法是从particularUse#.xsd中删除重新定义,将重新定义放在reused.xsd中,并确保所有文件一起使用(例如,在.NET中,您有XmlSchemaSet对象,需要将reused.xsd和一个或两个particularUse#.xsd添加到集合中)。通过使文件在作用域中,PSVI模型实际上将使用重新定义的myType,即使reused.xsd没有被任何particularUse#.xsd文件显式引用。

reused.xsd

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSR Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:redefine schemaLocation="definition.xsd">
    <xsd:simpleType name="myType">
      <xsd:restriction base="myType">
        <xsd:enumeration value="value1"/>
        <xsd:enumeration value="value2"/>
    </xsd:restriction>
    </xsd:simpleType>
  </xsd:redefine>
</xsd:schema>

particularUse1.xsd

代码语言:javascript
复制
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use1.xsd"/>
</xs:schema> 

particularUse2.xsd

代码语言:javascript
复制
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>

选项2

另一个选项应该适用于大多数主流XML编辑器,当只打开一个myType文件时,它将为您提供重新定义的particularUse#.xsd;这是如果您不介意为SpeciarUse2.xsd从use1.xsd中提取内容的范围(基于插图)。

reused.xsd

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSR Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:redefine schemaLocation="use1.xsd">
    <xsd:simpleType name="myType">
      <xsd:restriction base="myType">
        <xsd:enumeration value="value1"/>
        <xsd:enumeration value="value2"/>
    </xsd:restriction>
    </xsd:simpleType>
  </xsd:redefine>
</xsd:schema>

particularUse2.xsd

代码语言:javascript
复制
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="reused.xsd"/>
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>

不管选项如何,PSVI都会显示您想要的内容。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7715286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档