如何组合来自单独 XML 模式(俄罗斯套娃配置)的名称空间?
How to combine namespaces from separate XML schemas (russian doll configuration)?
我需要对 XML 模式进行非规范化,以便为某些将创建符合该模式的文档的人生成文档。用户不了解 XSD,很可能永远学不会。我见过的工具能够为其他 XSD 开发人员生成文档,但我的用户对如何构建模式的细节不感兴趣,他们只想知道他们可以和必须做什么来创建有效的文档。
因此,我正在寻找一种方法来解析 XML 模式中所有导入的命名空间、包含和引用,并生成一个我可以用来(反过来)生成用户文档的非规范化版本。
问题:
我能够解决大多数包含和引用。我需要知道的是如何解析所有 imported/included 名称空间以适应一个 XSD?
以下是 4 个相互链接的模式,我希望将所有内容都移至 "main_schema.xsd",因为这是人们目前所指的模式。 (注意:删除名称空间不是一个选项 - XML 文件中的数据 XSD 验证的数据具有名称空间)。
根据 "main_schema.xsd"
成功验证的示例数据文件
<schema_actions xmlns="http://abcd.com/schema/v1" xmlns:id="http://abcd.com/schema/InstrumentMaster/v1" created="2018-01-03T14:21:00.601-05:00" source="abcd">
<event>
<instrument>
<id:code scheme="123">LoremIpsum123</id:code>
<id:code scheme="124">LoremIpsum124</id:code>
<id:code scheme="125">LoremIpsum125</id:code>
<id:code scheme="321">LoremIpsum321</id:code>
<id:code scheme="320">LoremIpsum320</id:code>
</instrument>
</event>
</schema_actions>
main_schema.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="v1.0" targetNamespace="http://abcd.com/schema/v1">
<xs:include schemaLocation="data_format_schema.xsd"/>
</xs:schema>
data_format_schema.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:uca="http://abcd.com/schema/v1" xmlns:id="http://abcd.com/schema/InstrumentMaster/v1" xmlns:meta="http://abcd.com/schema/outgoing/v1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="v1.0">
<xs:import namespace="http://abcd.com/schema/outgoing/v1" schemaLocation="outgoing.xsd"/>
<xs:import namespace="http://abcd.com/schema/InstrumentMaster/v1" schemaLocation="master_information.xsd"/>
<xs:element name="schema_actions">
<xs:complexType>
<xs:sequence>
<xs:element ref="event" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attributeGroup ref="meta:outgoing"/>
</xs:complexType>
</xs:element>
<xs:element name="event" type="Trigger_Action"/>
<xs:complexType name="Trigger_Action">
<xs:sequence>
<xs:element name="instrument" type="id:Instrument"/>
</xs:sequence>
<xs:attributeGroup ref="meta:outgoing"/>
</xs:complexType>
</xs:schema>
master_information.xsd
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb" xmlns:uca="http://abcd.com/schema/InstrumentMaster/v1" targetNamespace="http://abcd.com/schema/InstrumentMaster/v1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="v1.0">
<xs:complexType name="Code">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="scheme" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="Instrument">
<xs:sequence>
<xs:element name="code" type="uca:Code" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
outgoing.xsd
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb" targetNamespace="http://abcd.com/schema/outgoing/v1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="v1.0">
<xs:attributeGroup name="outgoing">
<xs:attribute name="source" fixed="abcd" use="optional"/>
<xs:attribute name="created" type="xs:dateTime" use="optional"/>
<xs:anyAttribute processContents="lax"/>
</xs:attributeGroup>
</xs:schema>
非常感谢任何对此的见解!
XSD 语法要求如果两个全局声明具有不同的目标命名空间,则声明出现在不同的模式文档中。您可以按照自己喜欢的方式将声明合并到单个文件中,但该文件不会是 XSD 架构文档。
当我需要为(或以其他方式处理)一组模式文档生成文档时,我通常将它们全部放入单个 XML 文档中,作为我为其命名的包装元素的子元素喜欢 collection
。 (嗯,实际上,这不是真的;我通常将每个 xsd:schema
元素包装在一个父元素中,其中包含有关从中检索架构文档的 URI、检索日期和时间以及我认为有帮助的任何其他信息六、二十个月后,当出现问题时,我必须再次查看它。)
正如 Michael Kay 所观察到的,此 XML 文档不是 XSD 模式文档;它是一个 XML 文档,其中包含多个 XSD 模式文档。并非所有支持 XSD 的软件都能很好地处理这样的集合(尽管 XSD 规范中没有要求 xsd:schema
元素是其 XML 文档的最外层元素) ,但如果您正在编写代码来生成文档,那您不必担心。
我需要对 XML 模式进行非规范化,以便为某些将创建符合该模式的文档的人生成文档。用户不了解 XSD,很可能永远学不会。我见过的工具能够为其他 XSD 开发人员生成文档,但我的用户对如何构建模式的细节不感兴趣,他们只想知道他们可以和必须做什么来创建有效的文档。
因此,我正在寻找一种方法来解析 XML 模式中所有导入的命名空间、包含和引用,并生成一个我可以用来(反过来)生成用户文档的非规范化版本。
问题:
我能够解决大多数包含和引用。我需要知道的是如何解析所有 imported/included 名称空间以适应一个 XSD?
以下是 4 个相互链接的模式,我希望将所有内容都移至 "main_schema.xsd",因为这是人们目前所指的模式。 (注意:删除名称空间不是一个选项 - XML 文件中的数据 XSD 验证的数据具有名称空间)。
根据 "main_schema.xsd"
成功验证的示例数据文件<schema_actions xmlns="http://abcd.com/schema/v1" xmlns:id="http://abcd.com/schema/InstrumentMaster/v1" created="2018-01-03T14:21:00.601-05:00" source="abcd">
<event>
<instrument>
<id:code scheme="123">LoremIpsum123</id:code>
<id:code scheme="124">LoremIpsum124</id:code>
<id:code scheme="125">LoremIpsum125</id:code>
<id:code scheme="321">LoremIpsum321</id:code>
<id:code scheme="320">LoremIpsum320</id:code>
</instrument>
</event>
</schema_actions>
main_schema.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="v1.0" targetNamespace="http://abcd.com/schema/v1">
<xs:include schemaLocation="data_format_schema.xsd"/>
</xs:schema>
data_format_schema.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:uca="http://abcd.com/schema/v1" xmlns:id="http://abcd.com/schema/InstrumentMaster/v1" xmlns:meta="http://abcd.com/schema/outgoing/v1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="v1.0">
<xs:import namespace="http://abcd.com/schema/outgoing/v1" schemaLocation="outgoing.xsd"/>
<xs:import namespace="http://abcd.com/schema/InstrumentMaster/v1" schemaLocation="master_information.xsd"/>
<xs:element name="schema_actions">
<xs:complexType>
<xs:sequence>
<xs:element ref="event" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attributeGroup ref="meta:outgoing"/>
</xs:complexType>
</xs:element>
<xs:element name="event" type="Trigger_Action"/>
<xs:complexType name="Trigger_Action">
<xs:sequence>
<xs:element name="instrument" type="id:Instrument"/>
</xs:sequence>
<xs:attributeGroup ref="meta:outgoing"/>
</xs:complexType>
</xs:schema>
master_information.xsd
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb" xmlns:uca="http://abcd.com/schema/InstrumentMaster/v1" targetNamespace="http://abcd.com/schema/InstrumentMaster/v1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="v1.0">
<xs:complexType name="Code">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="scheme" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="Instrument">
<xs:sequence>
<xs:element name="code" type="uca:Code" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
outgoing.xsd
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb" targetNamespace="http://abcd.com/schema/outgoing/v1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="v1.0">
<xs:attributeGroup name="outgoing">
<xs:attribute name="source" fixed="abcd" use="optional"/>
<xs:attribute name="created" type="xs:dateTime" use="optional"/>
<xs:anyAttribute processContents="lax"/>
</xs:attributeGroup>
</xs:schema>
非常感谢任何对此的见解!
XSD 语法要求如果两个全局声明具有不同的目标命名空间,则声明出现在不同的模式文档中。您可以按照自己喜欢的方式将声明合并到单个文件中,但该文件不会是 XSD 架构文档。
当我需要为(或以其他方式处理)一组模式文档生成文档时,我通常将它们全部放入单个 XML 文档中,作为我为其命名的包装元素的子元素喜欢 collection
。 (嗯,实际上,这不是真的;我通常将每个 xsd:schema
元素包装在一个父元素中,其中包含有关从中检索架构文档的 URI、检索日期和时间以及我认为有帮助的任何其他信息六、二十个月后,当出现问题时,我必须再次查看它。)
正如 Michael Kay 所观察到的,此 XML 文档不是 XSD 模式文档;它是一个 XML 文档,其中包含多个 XSD 模式文档。并非所有支持 XSD 的软件都能很好地处理这样的集合(尽管 XSD 规范中没有要求 xsd:schema
元素是其 XML 文档的最外层元素) ,但如果您正在编写代码来生成文档,那您不必担心。