gpt4 book ai didi

xml - XSD 与来自其他 namespace 的元素

转载 作者:数据小太阳 更新时间:2023-10-29 01:38:45 24 4
gpt4 key购买 nike

我有两个定义不同文档的 XSD。比如说 A.xsd 定义了一个元素 ElementA 作为根,有一些复杂的规则。现在 B.xsd 定义了一个元素 ElementB,它应该在两者之间的某个地方使用 ElementA

例如,我希望 ElementB 的 XML 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<ElementB xmlns="http://example.com/namespace/for/ElementB">
<foo>Bla</foo>
<bar>Blub</bar>
<ElementA xmlns="http://example.com/namespace/for/ElementA">
<!-- ... -->
</ElementA>
</ElementB>

那么 B.xsd 可能如下所示:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="http://example.com/namespace/for/ElementB" targetNamespace="http://example.com/namespace/for/ElementB" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="ElementB">
<xs:complexType>
<xs:sequence>
<xs:element name="foo" type="xs:string" />
<xs:element name="bar" type="xs:string" />

<!-- And now I want to include ElementA somehow -->
<xs:element name="ElementA" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

问题是我真的不想将 ElementA 的规范克隆到 B.xsd 中,因为还有文档,只有 ElementA 作为根(即 ElementB 是某种容器文档)。

那么,我怎样才能在 ElementB 中允许 ElementA,同时完全建立在已经存在的 XSD 之上?

最佳答案

实际上有两种不同的方法来编写 XML 模式文档:<xs:import><xs:include> . xs:include 旨在在包含文档的 namespace 与被引用的 namespace 相同时使用,因此它不是您要查找的内容。 xs:import 更适合您的情况,当您需要引用所引用架构中的所有(或子集)元素并且它们位于不同的目标 namespace 中时。这里有一个关于差异的问题:What's the difference between xsd:include and xsd:import? .

无论如何,回到这个具体问题。你可能想要的是这样的:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema
xmlns="http://example.com/namespace/for/ElementB"
targetNamespace="http://example.com/namespace/for/ElementB"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
xmlns:ea="http://example.com/namespace/for/ElementA">
<xs:import namespace="http://example.com/namespace/for/ElementA" schemaLocation="A.xsd" />
<xs:element name="ElementB">
<xs:complexType>
<xs:sequence>
<xs:element name="foo" type="xs:string" />
<xs:element name="bar" type="xs:string" />
<!-- This introduces a element named ElementA that uses the ComplexType ea:ElementA defined in A.xsd -->
<xs:element name="ElementA" type="ea:ElementA" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

尽管您需要 A.xsd 来为 ElementA 创建一个复杂类型,您可以在 B.xsd 中使用它,如图所示。

这篇文章有一些很好的信息/示例,并包括对一些不同的可组合性策略的讨论:http://www.xfront.com/ZeroOneOrManyNamespaces.html

关于xml - XSD 与来自其他 namespace 的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6413145/

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