[英]How to parametrize type in XSD?
我有一個名為AdapterInputDataType的類型,它定義了某種輸入數據的格式:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://companyname.org/AdapterInputDataTypeNS"
xmlns:tns="http://companyname.org/AdapterInputDataTypeNS"
>
<complexType name="AdapterInputDataType">
<sequence>
<element name="atomicElement" type="tns:AtomicElementType" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="AtomicElementType">
<simpleContent>
<extension base="tns:AtomicElementValueType">
<attribute name="elementName" type="tns:AtomicElementNameType" use="required"/>
</extension>
</simpleContent>
</complexType>
<simpleType name="AtomicElementValueType">
<union memberTypes="string long decimal dateTime boolean"/>
</simpleType>
<simpleType name="AtomicElementNameType">
<restriction base="string">
<enumeration value="foo"/>
<enumeration value="bar"/>
<enumeration value="baz"/>
</restriction>
</simpleType>
</schema>
AdapterInputDataType用於在多個名稱空間內定義此類型的元素:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://companyname.org/adapter1"
xmlns:tns="http://companyname.org/adapter1"
xmlns:inptypns="http://companyname.org/AdapterInputDataTypeNS"
>
<import namespace="http://companyname.org/AdapterInputDataTypeNS"/>
<element name="adapterInputData" type="inptypns:AdapterInputDataType"/>
</schema>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://companyname.org/adapter2"
xmlns:tns="http://companyname.org/adapter2"
xmlns:inptypns="http://companyname.org/AdapterInputDataTypeNS"
>
<import namespace="http://companyname.org/AdapterInputDataTypeNS"/>
<element name="adapterInputData" type="inptypns:AdapterInputDataType"/>
</schema>
問題是,對於每個名稱空間,類型被導入到一組特定的允許值,應該定義elementName屬性。 換句話說,在不同的命名空間中,AdapterInputDataType應該基於不同的AtomicElementNameType類型。
有沒有辦法在AdapterInputDataType定義中使用某種參數而不是AtomicElementNameType,並將不同的AtomicElementNameType類型放在不同的命名空間中作為此參數的值?
聽起來像是替代團體的情況。
使用abstract =“true”將atomicAlement定義為全局元素聲明,然后在各種特定於消息的模式文檔中,您可以使用substitutionGroup =“tns:atomicElement”來定義具體元素,以使它們可替代抽象元素。 具體元素的類型必須與抽象元素的類型相同或派生; 這通常通過給出抽象元素type =“xs:anyType”來實現。
得到了解決方案(感謝Michael Kay關於替換組的暗示)。
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://companyname.org/AdapterInputDataTypeNS"
xmlns:tns="http://companyname.org/AdapterInputDataTypeNS"
>
<import namespace="http://companyname.org/adapter1" schemaLocation="adapter1/ElementName.xsd"/>
<import namespace="http://companyname.org/adapter2" schemaLocation="adapter2/ElementName.xsd"/>
<element name="adapterInputData" type="tns:AdapterInputDataType" />
<complexType name="AdapterInputDataType">
<sequence>
<element name="atomicElement" type="tns:AtomicElementType" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="AtomicElementType">
<sequence>
<element ref="tns:elementName" minOccurs="1" maxOccurs="1"/>
<element name="elementValue" type="tns:AtomicElementValueType" minOccurs="1" maxOccurs="1"/>
</sequence>
</complexType>
<simpleType name="AtomicElementValueType">
<union memberTypes="string long decimal dateTime boolean"/>
</simpleType>
<element name="elementName" type="string" abstract="true"/>
</schema>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://companyname.org/adapter1"
xmlns:tns="http://companyname.org/adapter1"
xmlns:inptypns="http://companyname.org"
>
<element name="elementName" type="tns:AtomicElementNameType" substitutionGroup="inptypns:elementName"/>
<simpleType name="AtomicElementNameType">
<restriction base="string">
<enumeration value="foo"/>
<enumeration value="bar"/>
</restriction>
</simpleType>
</schema>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://companyname.org/adapter2"
xmlns:tns="http://companyname.org/adapter2"
xmlns:inptypns="http://companyname.org"
>
<element name="elementName" type="tns:AtomicElementNameType" substitutionGroup="inptypns:elementName"/>
<simpleType name="AtomicElementNameType">
<restriction base="string">
<enumeration value="baz"/>
</restriction>
</simpleType>
</schema>
AtomicElementType
針對原始帖子中的一個進行了位修改。 elementName
屬性已替換為elementName
子元素。 原因是屬性不能聲明為抽象。 以下是針對此架構有效的數據示例:
<ans:adapterInputData xmlns:ans="http://companyname.org">
<atomicElement>
<ans1:elementName xmlns:ans1="http://companyname.org/adapter1">foo</ans1:elementName>
<elementValue>hello</elementValue>
</atomicElement>
<atomicElement>
<ans2:elementName xmlns:ans2="http://companyname.org/adapter2">baz</ans2:elementName>
<elementValue>123</elementValue>
</atomicElement>
</ans:adapterInputData>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.