将两个具有不重叠定义的命名空间 2 的 XSD 导入命名空间 1 的 XSD 中

问题描述 投票:0回答:1

我指的是问题 “从不同的 xsd 导入相同的命名空间”,区别在于我的两个导入的 XSD 中的定义不重叠。

我需要将两个具有相同命名空间和不重叠元素或类型定义的 XSD(kd1.xsd 和 kd2.xsd)导入到具有自己的命名空间的父 XSD(main.xsd)中。例如,main.xsd 由应用程序、类生成器和验证器读取。

要导入的 XSD 使用另一个 XSD (other.xsd) 中的两个定义,该 XSD 与 main.xsd 位于同一命名空间中。不过,我认为这与问题无关。

我的问题是第二个导入的 kd2.xsd 的定义显然不可见。

main.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://www.anbieter.de/xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:kun="http://www.anbieter.de/xsd"
    targetNamespace="http://www.anbieter.de/xsd"
    xsi:schemaLocation="http://www.anbieter.de/xsd other.xsd
        http://www.kunde.de/xsd kd1.xsd
        http://www.kunde.de/xsd kd2.xsd">

    <xs:include schemaLocation="other.xsd"/>
    <xs:import namespace="http://www.kunde.de/xsd" schemaLocation="kd1.xsd"/>
    <xs:import namespace="http://www.kunde.de/xsd" schemaLocation="kd2.xsd"/>
</xs:schema>

kd1.xsd、kd2.xsd

<?xml version="1.0"?>
<xs:schema xmlns="http://www.kunde.de/xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:kun="http://www.kunde.de/xsd"
    targetNamespace="http://www.kunde.de/xsd"
    elementFormDefault="qualified" attributeFormDefault="unqualified">

    <xs:element name="element1">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="sub11" type="xs:string"/>
                <xs:element name="sub12" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

<?xml version="1.0"?>
<xs:schema xmlns="http://www.kunde.de/xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:kun="http://www.kunde.de/xsd"
    targetNamespace="http://www.kunde.de/xsd"
    elementFormDefault="qualified" attributeFormDefault="unqualified">

    <xs:element name="element2">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="sub21" type="xs:string"/>
                <xs:element name="sub22" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

其他.xsd:

<?xml version="1.0"?>
<xs:schema xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.anbieter.de/xsd"
    elementFormDefault="qualified" attributeFormDefault="unqualified">

    <xs:element name="otherelement">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="foo" type="xs:string"/>
                <xs:element name="bar" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

例如,拉入 main.xsd 的验证器会看到 kd1.xsd 中 element1 的定义,但看不到 kd2.xsd 中 element2 的定义(“找不到 ... 的声明”)。

<?xml version="1.0" encoding="UTF-8"?>
<kun:element1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.anbieter.de/xsd"
 xmlns:kun="http://www.kunde.de/xsd"
 xsi:schemaLocation="http://www.kunde.de/xsd file:/C:/Users/uheyder/Downloads/main.xsd">
    <kun:sub11>sub110</kun:sub11>
    <kun:sub12>sub120</kun:sub12>
</kun:element1>

还可以,但是

<?xml version="1.0" encoding="UTF-8"?>
<kun:element2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.anbieter.de/xsd"
 xmlns:kun="http://www.kunde.de/xsd"
 xsi:schemaLocation="http://www.kunde.de/xsd file:/C:/Users/uheyder/Downloads/main.xsd">
    <kun:sub21>sub110</kun:sub21>
    <kun:sub22>sub120</kun:sub22>
</kun:element2>

不是。如果我交换导入线,则相反。

同样,我可以使用所用 XML 开发工具的 XML 示例生成器生成 element1 的示例,但不能生成 element2 的示例。

问题1: 通常是否不允许且可能将具有相同命名空间和不重叠元素或类型定义的两个 XSD 直接导入到具有自己命名空间的父 XSD 中,以便可以单独使用父 XSD?

问题2: 如果有选择,我需要如何以不同的方式构建我的 XSD 或更改内容?

限制就是这样

  • kd1.xsd 和 kd2.xsd 的命名空间相同

  • 这与 main.xsd 和

    的命名空间不同
  • 仅使用 main.xsd 作为锚点

作为紧急解决方案,我会在 kd1.xsd 和 kd2.xsd 的命名空间中导入额外的辅助 XSD,其中又包含 kd1.xsd 和 kd2.xsd。然而,我发现这个解决方案很麻烦而且不太透明。

注意:该示例非常简化,但会导致与实际 XSD 模型相同的问题。

谢谢,乌尔夫

xml xsd
1个回答
0
投票

一般来说,从两个不同位置导入相同命名空间的模式是不可互操作的:不同的模式处理器将以不同的方式处理它。我认为您没有说过您正在使用哪种模式处理器,所以我无法给您特定于产品的答案。一些模式处理器提供了控制此操作的选项,例如 Saxon 有一个配置选项

MULTIPLE_SCHEMA_IMPORTS

实现可互操作结果的最佳方法是从单个存根文档导入命名空间,该存根文档包含多个“真实”模式文档的

xs:include
声明:您的“紧急解决方案”。

© www.soinside.com 2019 - 2024. All rights reserved.