XSD 对于 XML 包含 XSD
XSD for XML containing XSD
我已经为描述复杂模块化系统组件功能的 XML 文档创建了 XML 架构。在该 XML 文档中,我想包含 XML 架构,该架构将被读取和解析以允许配置。
meta-schema.xsd
(为简洁起见进行了大量编辑):
<xs:schema targetNamespace="urn:project"
xmlns="urn:project"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="Schema" type="SchemaType"/>
<xs:complexType name="SchemaType">
<xs:sequence>
<xs:element type="ConfigurationType" name="Configuration"/>
<xs:any maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ConfigurationType">
<xs:sequence>
<xs:element ref="xs:schema"/> <!-- Does not work -->
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
</xs:schema>
所需的XML(由开发模块的人编写):
<Schema xmlns="urn:project"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:project meta-schema.xsd">
<!-- Snip -->
<Configuration>
<schema>
<element name="enable" type="boolean">
<annotation>
<appinfo>Usage:</appinfo>
<documentation xml:lang="en">
Enable functionality
</documentation>
</annotation>
</element>
</schema>
</Configuration>
</Schema>
这可以用XSD表达吗?如果可以,怎么做?
编辑:
基于,这是不可能的。我的解决方案是使用带有 ##other
命名空间的 any
元素,并带有注释:
<xs:complexType name="ConfigurationType">
<xs:choice>
<xs:element name="hex" type="xs:hexBinary"/>
<xs:element name="base64" type="xs:base64Binary"/>
<!-- If configuration isn't binary, modules should create an XML Schema of the configuration options in order to
facilitate future tooling, when feasible. -->
<xs:any namespace="##other" processContents="lax"/>
</xs:choice>
<xs:anyAttribute/>
</xs:complexType>
启用以下 XML:
<Schema xmlns="urn:project"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:project meta-schema.xsd">
<!-- Snip -->
<Configuration>
<xs:schema targetNamespace="urn:project"
xmlns="urn:project"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="enable" type="xs:boolean">
<xs:annotation>
<xs:appinfo>Usage:</xs:appinfo>
<xs:documentation xml:lang="en">
Enable left radial pulse functionality
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>
</Configuration>
</Schema>
XML 文档实例与其关联的 XSD 之间的 link 是通过 xsi:schemaLocation
或 xsi:noNamespaceSchemaLocation
建立的。
- 见How to link XML to XSD using schemaLocation or noNamespaceSchemaLocation?
尝试将 XSD 实际包含在 XSD 中是非常不寻常的。 (没有 XSD 等同于 XML DTD 的内部子集。)
- 见
当然,您始终可以添加类型为 xs:anyURI
的属性或元素来表达这种联系,但这种联系对于 XML/XSD 语义来说是不透明的。您还可以使用 external entities 合并任何文件,包括 XSD,但是,同样,这是文件级别的机制,而不是 XML/XSD 级别的机制。
我已经为描述复杂模块化系统组件功能的 XML 文档创建了 XML 架构。在该 XML 文档中,我想包含 XML 架构,该架构将被读取和解析以允许配置。
meta-schema.xsd
(为简洁起见进行了大量编辑):
<xs:schema targetNamespace="urn:project"
xmlns="urn:project"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="Schema" type="SchemaType"/>
<xs:complexType name="SchemaType">
<xs:sequence>
<xs:element type="ConfigurationType" name="Configuration"/>
<xs:any maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ConfigurationType">
<xs:sequence>
<xs:element ref="xs:schema"/> <!-- Does not work -->
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
</xs:schema>
所需的XML(由开发模块的人编写):
<Schema xmlns="urn:project"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:project meta-schema.xsd">
<!-- Snip -->
<Configuration>
<schema>
<element name="enable" type="boolean">
<annotation>
<appinfo>Usage:</appinfo>
<documentation xml:lang="en">
Enable functionality
</documentation>
</annotation>
</element>
</schema>
</Configuration>
</Schema>
这可以用XSD表达吗?如果可以,怎么做?
编辑:
基于##other
命名空间的 any
元素,并带有注释:
<xs:complexType name="ConfigurationType">
<xs:choice>
<xs:element name="hex" type="xs:hexBinary"/>
<xs:element name="base64" type="xs:base64Binary"/>
<!-- If configuration isn't binary, modules should create an XML Schema of the configuration options in order to
facilitate future tooling, when feasible. -->
<xs:any namespace="##other" processContents="lax"/>
</xs:choice>
<xs:anyAttribute/>
</xs:complexType>
启用以下 XML:
<Schema xmlns="urn:project"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:project meta-schema.xsd">
<!-- Snip -->
<Configuration>
<xs:schema targetNamespace="urn:project"
xmlns="urn:project"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="enable" type="xs:boolean">
<xs:annotation>
<xs:appinfo>Usage:</xs:appinfo>
<xs:documentation xml:lang="en">
Enable left radial pulse functionality
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>
</Configuration>
</Schema>
XML 文档实例与其关联的 XSD 之间的 link 是通过 xsi:schemaLocation
或 xsi:noNamespaceSchemaLocation
建立的。
- 见How to link XML to XSD using schemaLocation or noNamespaceSchemaLocation?
尝试将 XSD 实际包含在 XSD 中是非常不寻常的。 (没有 XSD 等同于 XML DTD 的内部子集。)
- 见
当然,您始终可以添加类型为 xs:anyURI
的属性或元素来表达这种联系,但这种联系对于 XML/XSD 语义来说是不透明的。您还可以使用 external entities 合并任何文件,包括 XSD,但是,同样,这是文件级别的机制,而不是 XML/XSD 级别的机制。