gpt4 book ai didi

xsd - 如何在 XSD 中重用 simpleType 重定义

转载 作者:行者123 更新时间:2023-12-02 07:45:01 26 4
gpt4 key购买 nike

想象在 definition.xsd

中有一个已定义的简单类型
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="myType">
<xs:restriction base="xs:string" />
</xs:simpleType>
</xs:schema>

那么该类型在2个不同的xsds中使用:use1.xsduse2.xsd:

use1.xsd:

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

use2.xsd:

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

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

<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 和 specificUse2.xsd,它们不会重复。

最好是另一个文件reused.xsd:

    <xs:simpleType name="myType">
<xs:restriction base = "myType">
<xs:enumeration value = "value1"/>
<xs:enumeration value = "value2"/>
</xs:restriction>
</xs:simpleType>

reused.xsd 文件中的引用用于 particularUse1.xsdparticularUse2.xsd

最佳答案

答案实际上取决于您对 XSD 文件施加的限制、它们的使用以及您将用于使用 XML Schema 文件的工具。此图显示了问题所述的文件布局。

The layout as described by the question.

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

选项 1

一种方法是从 specificUse#.xsd 中删除重新定义,将重新定义放在reused.xsd 中,并确保所有文件一起使用(例如,在 .NET 中您有 XmlSchemaSet 对象,您需要已重用.xsd 和其中一个或两个都添加到集合中)。通过将文件置于范围内,PSVI 模型将实际使用重新定义的 myType,即使任何特定的 Use#.xsd 文件未明确引用 reused.xsd。

Layout option 1

reused.xsd

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

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:include schemaLocation="use1.xsd"/>
</xs:schema>

particularUse2.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:include schemaLocation="use2.xsd"/>
</xs:schema>

选项 2

这个其他选项应该适用于大多数主流 XML Schema 编辑器,它会在只打开一个特定的 Use#.xsd 文件时为您提供重新定义的 myType;前提是您不介意将 use1.xsd 中的内容拉入到 specificUse2.xsd 的范围内(基于插图)。

Layout option 2

reused.xsd

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

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:include schemaLocation="reused.xsd"/>
<xs:include schemaLocation="use2.xsd"/>
</xs:schema>

无论选项如何,PSVI 都能准确显示您想要的内容。

PSVI showing the redefined type

关于xsd - 如何在 XSD 中重用 simpleType 重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7715286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com