簡體   English   中英

如何在XSD中參數化類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM