Freigeben über


Datentypen für zusammengesetzte Vorlagen

Ein COMPOSITE-Datentyp besteht aus mindestens einem Wert, der denselben oder unterschiedlichen Datentypen aufweist. Zusammengesetzte Elemente können eine feste oder variable (aber nicht unbegrenzte) Länge aufweisen. Dieser Datentyp ähnelt dem C lLanguage-Strukturdatentyp.

*DataType: COMPOSITE weist eine Vorlage an, um einen zusammengesetzten Datentyp zu definieren, dessen Member unterschiedlicher Datentypen sein können. Die Member des COMPOSITE-Datentyps werden als einzelne untergeordnete XML-Elemente ausgegeben, die zu dem Element gehören, das den eingeschlossenen Kontext darstellt. Wenn jedes untergeordnete Element einen Datentypgrundtyp darstellt, wird der Datentyp durch das XML-Attribut xsi:type in jedem Element definiert. Wenn ein GDL-Attribut als DataType: COMPOSITE definiert ist, ist der einschließende Kontext das <GDL_ATTRIBUTE-Element> . Der Elementname jedes untergeordneten XML-Elements ist das entsprechende Tag, das von der Anweisung definiert wird: *ElementTags.

Wenn der COMPOSITE selbst ein Member eines anderen zusammengesetzten Datentyps ist, wird ein Element erstellt, um diesen eingeschlossenen Kontext darzustellen. Der Name dieses übergeordneten Elements ist das entsprechende Tag, das von der Vorlage zugewiesen wird, das dem eingeschlossenen zusammengesetzten Datentyp entspricht.

Die folgenden Anweisungen werden verwendet, um den COMPOSITE-Datentyp zu definieren:

  • *ElementType (erforderlich). Der Name der Vorlage, die die Datentypen der einzelnen Elemente definiert. Für jedes Element muss ein Datentyp angegeben werden. Mindestens ein Element kann denselben Datentyp aufweisen. Die Anzahl der bereitgestellten ElementTypes sollte dem ArraySize- oder Max-Wert entsprechen, den *ArraySize angibt.

  • *RequiredDelimiter (Erforderlich). Eine Zeichenfolge, die jedes COMPOSITE-Element syntaktisch vom nächsten trennt. Zwei aufeinanderfolgende Trennzeichen werden als ausgelassenes Element interpretiert. Trennzeichen sind nicht erforderlich, um das Weglassen von nachgestellten Elementen anzugeben.

    Sie sollten sehr vorsichtig sein, wenn Sie Leerzeichen als Trennzeichen oder als Teil der Trennzeichenzeichenfolge verwenden. Der Parser interpretiert z. B. zusätzliche Leerzeichen als Zeichen für ausgelassene Elemente. und da möglicherweise kein zusätzliches Leerzeichen angezeigt wird, können seltsame Analysefehler auftreten. Darüber hinaus wird überschüssiger Leerraum routinemäßig aus der Quelldatei entfernt, und leerzeichen werden dem Eingabedatenstrom häufig als Ergebnis der Vorprozessor-, Makro- und Kommentarverarbeitung hinzugefügt. Daher kann die tatsächliche Zeichenfolge, die analysiert wird, eine völlig andere Anzahl von Leerzeichen als ursprünglich angegeben haben. Tabulatorzeichen sollten nicht als Teil der erforderlichen Trennzeichenzeichenfolge verwendet werden, da sie während der Eingabeverarbeitung routinemäßig in Leerzeichen konvertiert werden.

  • *OptionalDelimiter (Optional). Jede Zeichenfolge, die aus Zeichen besteht, die in *OptionalDelimiter angegeben sind und neben der *RequiredDelimiter-Zeichenfolge angezeigt werden, werden als Teil des Trennzeichens betrachtet.

  • *ElementTags (erforderlich). Die Anzahl der bereitgestellten Tags sollte dem ArraySize- oder Max-Wert entsprechen, den *ArraySize angibt. Jedes Element wird mit dem entsprechenden Tag markiert. Dieses Tagging ist nützlich, wenn ein oder mehrere Elemente weggelassen werden. Wenn COMPOSITE-Elemente weggelassen werden, wird das Tag, das dem ausgelassenen Element entspricht, nicht verwendet. Um den Client nicht zu verwirren, verwenden Sie keine GDL-Momentaufnahme reservierten Elementnamen als Tagnamen. Diese reservierten Namen sind CONSTRUCT, ATTRIBUTE und Personality.

  • *ArraySize (optional). Wenn diese Anweisung weggelassen wird, wird ein COMPOSITE mit fester Größe angenommen. Die Größe entspricht der Anzahl der Vorlagennamen in *ElementType.

    Verwenden Sie zwei ganze Zahlen, um die minimale und maximale zulässige Größe für einen COMPOSITE mit variabler Größe anzugeben. Beachten Sie, dass null für die Mindestgröße zulässig ist. COMPOSITE-Datentypen mit unbegrenzter Größe sind nicht zulässig. Sie können nicht das GPD-Platzhalterzeichen (*) verwenden, um die Größe oder maximale Größe anzugeben.

  • *ArrayLabel (optional). Wenn diese Direktive angegeben wird, muss die Liste der COMPOSITE-Elemente in Klammern eingeschlossen und durch die Bezeichnung *ArrayLabel vorangestellt werden. Wenn in dieser Anweisung keine Bezeichnung angegeben ist, sind die Klammern optional, und es ist keine präfacing-Bezeichnung zulässig.

Betrachten Sie die folgende Vorlage.

*Template:  QUALNAME_EX
{
    *Type:  DATATYPE
    *DataType:   COMPOSITE
    *ElementType: (SYMBOL, SYMBOL, INTEGER)
    *RequiredDelimiter: "."
    *ElementTags: (feature, option, resourceID)
}

Die vorherige Vorlage definiert eine feste Größe, COMPOSITE aus zwei SYMBOL-Datentypen und einer ganzen Zahl. Der COMPOSITE-Wert ist nicht beschriftet. Jedem Element im COMPOSITE wird ein eindeutiges ElementTag zugewiesen. Diese Tags bezeichnen jedes Element in der XML-Ausgabe, um dem Client zu helfen. Jedes Element ist durch genau einen Punkt (.) vom nächsten getrennt; keine anderen Zeichen werden als Teil des Trennzeichens betrachtet. *ArraySize ist nicht angegeben, sodass eine feste COMPOSITE-Größe angenommen wird. Da die COMPOSITE-Größe behoben ist, ist keine Auslassung von Membern zulässig.

*DataType: COMPOSITE-Vorlagen generieren kein entsprechendes Schema. Stattdessen wird das Schema der Vorlagen verwendet, die in der *ElementType-Direktive benannt sind.

Betrachten Sie beispielsweise eine SYMBOL-Vorlage, die wie folgt definiert ist.

*Template:  SYMBOL
{
    *Type:  DATATYPE
    *DataType:   FILTER_TYPE
    *ElementType:  XML_STRING
    *FilterTypeName: "SYMBOLNAME"
}

Und berücksichtigen Sie den folgenden GDL-Eintrag.

*rcNameID:     ( RESDLL.stdname.467 )  

Oder betrachten Sie den folgenden GDL-Eintrag, der nicht über die optionalen Klammern verfügt.

*rcNameID:     RESDLL.stdname.467

Angenommen, der GDL-Eintrag wird mithilfe der folgenden RC_NAME_ID-Vorlage interpretiert.

*Template:  RC_NAME_ID
{
    *Name:  "*rcNameID"
    *Type:  ATTRIBUTE
    *ValueType:  QUALNAME_EX
    *Additive: LEAST_TO_MOST_RECENT
}

Die resultierende XML-Ausgabe lautet wie folgt.

    <GDL_ATTRIBUTE Name="*rcNameID"  >
        <feature  xsi:type="GDLW_string">RESDLL</feature>
        <option  xsi:type="GDLW_string">stdname</option>
        <resourceID  xsi:type="GDLW_int">467</resourceID>
    </GDL_ATTRIBUTE>

Das folgende Beispiel zeigt geschachtelte zusammengesetzte Datentypen mithilfe eines INTERVAL-Datentyps, der ein DATE-Datentyppaar enthält, das ein Zeitintervall darstellt. Jeder DATE-Datentyp ist ein COMPOSITE aus einem MONATS-, DAY- und YEAR-Datentyp. Der INTERVAL-Datentyp wird vom VACATION GDL-Attribut verwendet, um einen Zeitraum auszudrücken, in dem ein Mitarbeiter möglicherweise abwesend ist. Die folgende Sammlung von Vorlagen würde diese Situation erfüllen.

Monatsvorlage

*Template:  MONTHS
{
    *Type:  DATATYPE
    *DataType:   ENUMERATOR
    *XMLDataType: "months"
    *EnumeratorList: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)
}

Tagesvorlage

*Template:  DAY
{
*Inherits: INTEGER
*MinValue: 1
*MaxValue: 31
}

Jahresvorlage

*Template:  YEAR
{
*Inherits: INTEGER
*MinValue: 1900
*MaxValue: 2100
}

Datumsvorlage

*Template:  DATE
{
    *Type:  DATATYPE
    *DataType:   COMPOSITE
    *ElementType: (MONTHS, DAY, YEAR)
    *RequiredDelimiter: "-"
    *ElementTags: (month, day, year)
}

Intervallvorlage

*Template:  INTERVAL
{
    *Type:  DATATYPE
    *DataType:   ARRAY
    *ElementType:  DATE
    *RequiredDelimiter: "to"
    *OptionalDelimiter: "<20 09>"
    *ElementTags: (start_date, end_date)
    *ArraySize: 2
}

Urlaubsvorlage

*Template:  VACATION
{
    *Name:  "*VacationDates"
    *Type:  ATTRIBUTE
    *ValueType:  INTERVAL
}

Betrachten Sie den folgenden GDL-Eintrag.

*VacationDates:  Dec-20-2001 to Jan-3-2002

Wenn dieser GDL-Eintrag mithilfe der VACATION-Vorlage interpretiert wird, lautet die resultierende XML-Ausgabe wie folgt.

    <GDL_ATTRIBUTE Name="*VacationDates"  >
        <start_date >
            <month  xsi:type="GDLW_months">Dec</month>
            <day  xsi:type="GDLW_int">20</day>
            <year  xsi:type="GDLW_int">2001</year>
        </start_date>
        <end_date >
            <month  xsi:type="GDLW_months">Jan</month>
            <day  xsi:type="GDLW_int">3</day>
            <year  xsi:type="GDLW_int">2002</year>
        </end_date>
    </GDL_ATTRIBUTE>