복합 템플릿 데이터 형식

COMPOSITE 데이터 형식은 동일하거나 다른 데이터 형식을 가진 하나 이상의 값으로 구성됩니다. 복합은 고정 또는 변수 길이(무기한이 아님)를 가질 수 있습니다. 이 데이터 형식은 C lLanguage 구조 데이터 형식과 유사합니다.

*DataType: COMPOSITE 는 멤버가 다른 데이터 형식일 수 있는 복합 데이터 형식을 정의하도록 템플릿을 지시합니다. COMPOSITE 데이터 형식의 멤버는 바깥쪽 컨텍스트를 나타내는 요소에 속하는 개별 XML 자식 요소로 출력됩니다. 각 자식 요소가 데이터 형식 기본 형식을 나타내는 경우 데이터 형식은 각 요소의 XML 특성 xsi:type 에 의해 정의됩니다. GDL 특성이 DataType: COMPOSITE로 정의되면 바깥쪽 컨텍스트가 GDL_ATTRIBUTE> 요소가 됩니다<. 각 XML 자식 요소의 요소 이름은 지시문*ElementTags로 정의된 해당 태그가 됩니다.

COMPOSITE 자체가 다른 복합 데이터 형식의 멤버인 경우 해당 바깥쪽 컨텍스트를 나타내는 요소가 만들어집니다. 이 부모 요소의 이름은 바깥쪽 복합 데이터 형식에 해당하는 템플릿에서 할당한 해당 태그입니다.

다음 지시문은 COMPOSITE 데이터 형식을 정의하는 데 사용됩니다.

  • *ElementType (필수). 각 요소의 데이터 형식을 정의하는 템플릿의 이름입니다. 각 요소에 대해 하나의 데이터 형식을 지정해야 합니다. 하나 이상의 요소는 동일한 데이터 형식을 가질 수 있습니다. 제공된 ElementType의 수는 *ArraySize 가 지정하는 ArraySize 또는 최대값과 같아야 합니다.

  • *RequiredDelimiter (필수). 각 COMPOSITE 요소를 다음 요소와 구문적으로 구분하는 문자열입니다. 두 개의 연속 구분 기호가 생략된 요소로 해석됩니다. 후행 요소의 누락을 나타내기 위해 구분 기호가 필요하지 않습니다.

    공백을 구분 기호로 사용하거나 구분 기호 문자열의 일부로 사용하는 경우 매우 주의해야 합니다. 예를 들어 파서는 불필요한 공백 문자를 생략된 요소를 나타내는 것으로 해석합니다. 추가 공백이 표시되지 않을 수 있으므로 이상한 구문 분석 오류가 발생할 수 있습니다. 또한 과도한 공백은 원본 파일에서 정기적으로 제거되고 공백은 전처리기, 매크로 및 주석 처리의 결과로 입력 스트림에 추가되는 경우가 많습니다. 따라서 구문 분석되는 실제 문자열은 원래 지정된 것과 완전히 다른 수의 공백 문자를 가질 수 있습니다. 탭 문자는 입력 처리 중에 공백 문자로 정기적으로 변환되므로 필수 구분 기호 문자열의 일부로 사용하면 안 됩니다.

  • *OptionalDelimiter (선택 사항). *RequiredDelimiter 문자열에 인접한 *OptionalDelimiter에 지정된 문자로 구성된 모든 문자열은 구분 기호의 일부로 간주됩니다.

  • *ElementTags (필수). 제공된 태그 수는 *ArraySize 가 지정하는 ArraySize 또는 최대값과 같아야 합니다. 각 멤버는 해당 태그로 태그가 지정됩니다. 이 태그 지정은 하나 이상의 요소를 생략하는 경우에 유용합니다. COMPOSITE 요소를 생략하면 생략된 요소에 해당하는 태그가 사용되지 않습니다. 클라이언트 혼동을 방지하려면 GDL 스냅샷 예약 요소 이름을 태그 이름으로 사용하지 마세요. 이러한 예약된 이름은 CONSTRUCT, ATTRIBUTE 및 Personality입니다.

  • *ArraySize (선택 사항). 이 지시문을 생략하면 고정 크기 COMPOSITE가 가정됩니다. 크기는 *ElementType의 템플릿 이름 수와 같습니다.

    두 개의 정수를 사용하여 가변 크기의 COMPOSITE에 허용되는 최소 및 최대 크기를 지정합니다. 최소 크기는 0으로 허용됩니다. 무제한 크기의 COMPOSITE 데이터 형식은 허용되지 않습니다. GPD 와일드카드 문자(*)를 사용하여 크기 또는 최대 크기를 지정할 수 없습니다.

  • *ArrayLabel (선택 사항). 이 지시문을 지정하는 경우 COMPOSITE 요소 목록은 괄호로 묶어야 하며 *ArrayLabel 레이블 앞에 와야 합니다. 이 지시문에 레이블이 지정되지 않은 경우 괄호는 선택 사항이며 접두사 레이블은 허용되지 않습니다.

다음 템플릿을 고려합니다.

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

앞의 템플릿은 두 개의 SYMBOL 데이터 형식과 1개의 정수로 구성된 고정 크기 COMPOSITE를 정의합니다. COMPOSITE의 레이블이 지정되지 않았습니다. COMPOSITE의 각 요소에는 고유한 ElementTag가 할당됩니다. 이러한 태그는 클라이언트에 도움이 되도록 XML 출력의 각 요소에 레이블을 지정합니다. 각 요소는 정확히 하나의 마침표(.);로 다음 요소와 구분됩니다. 다른 문자는 구분 기호의 일부로 간주되지 않습니다. *ArraySize 가 지정되지 않았으므로 고정 COMPOSITE 크기가 가정됩니다. COMPOSITE 크기가 고정되어 있으므로 멤버 누락이 허용되지 않습니다.

*DataType: COMPOSITE 템플릿은 해당 스키마를 생성하지 않습니다. *ElementType 지시문에 이름이 지정된 템플릿의 스키마가 대신 사용됩니다.

예를 들어 다음과 같이 정의된 SYMBOL 템플릿을 고려합니다.

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

다음 GDL 항목을 고려합니다.

*rcNameID:     ( RESDLL.stdname.467 )  

또는 선택적 괄호가 없는 다음 GDL 항목을 고려합니다.

*rcNameID:     RESDLL.stdname.467

다음 RC_NAME_ID 템플릿을 사용하여 GDL 항목이 해석된다고 가정합니다.

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

결과 XML 출력은 다음과 같습니다.

    <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>

다음 예제에서는 시간 간격을 나타내는 DATE 데이터 형식의 쌍을 보유하는 INTERVAL 데이터 형식을 사용하여 중첩된 복합 데이터 형식을 보여줍니다. 각 DATE 데이터 형식은 월, 일 및 연도 데이터 형식의 COMPOSITE입니다. INTERVAL 데이터 형식은 VACATION GDL 특성에서 직원이 없을 수 있는 기간을 표현하는 데 사용됩니다. 다음 템플릿 컬렉션은 이 상황을 수행합니다.

월 서식 파일

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

일 서식 파일

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

연도 서식 파일

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

날짜 서식 파일

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

간격 템플릿

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

휴가 서식 파일

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

다음 GDL 항목을 고려합니다.

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

이 GDL 항목이 VACATION 템플릿을 사용하여 해석되는 경우 결과 XML 출력은 다음과 같습니다.

    <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>