pok*_*oke 21 xml xsd xml-namespaces
我有两个XSD定义不同的文档.Say A.xsd
将元素定义ElementA
为根,具有一些复杂的规则.现在B.xsd
定义一个ElementB
应该ElementA
在两者之间使用的元素.
例如,我希望XML文件ElementB
看起来像这样:
<?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>
Run Code Online (Sandbox Code Playgroud)
然后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>
Run Code Online (Sandbox Code Playgroud)
问题是,我真的不希望克隆的规格ElementA
为B.xsd
,因为也有文件,那只是ElementA
作为根(即ElementB
某种容器文件).
那么,如何在已经存在的XSD之上完全构建的同时允许ElementA
内部ElementB
?
dav*_*ick 33
实际上有两种不同的方法来组成XML Schema文档:<xs:import>
和<xs:include>
.xs:include旨在当包含文档的命名空间与被引用文档的名称空间相同时使用,因此它不是您正在寻找的内容.当您需要引用引用模式中的所有(或子集)元素并且它们位于不同的目标名称空间中时,xs:import更适合您的情况.这里有一个关于差异的问题:xsd:include和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>
Run Code Online (Sandbox Code Playgroud)
虽然您需要A.xsd为ElementA创建一个复杂类型,您可以在B.xsd中使用它,如图所示.
本文提供了一些很好的信息/示例,并讨论了一些不同的可组合性策略:http://www.xfront.com/ZeroOneOrManyNamespaces.html
归档时间: |
|
查看次数: |
48372 次 |
最近记录: |