IT

XSD: 강력한 형식의 "단순한" 요소에 속성 추가

itgroup 2023. 10. 10. 20:15
반응형

XSD: 강력한 형식의 "단순한" 요소에 속성 추가

강력하게 유형화된 단순 유형과 속성을 가진 요소를 가질 수 있는 합리적인 방법이 있습니까?

좋아요, XSD 스키마는 다음과 같은 100만개의 요소를 가지고 있습니다.

<xsd:element name="DocumentDescription" type="xsd:string" />
<xsd:element name="DocumentDateTime" type="xsd:dateTime" />
<xsd:element name="DocumentSize" type="xsd:int" />

멋집니다.하지만 저는 이 모든 요소에 "format"과 "isVisible"과 같은 공통적인 속성이 있기를 바랍니다. 즉, 다음과 같은 스키마가 있습니다.

<DocumentDescription isVisible="true">doc description</DocumentDescription>
<DocumentDateTime format="dd/mm/yyyy" isVisible="true">1/1/2008</DocumentDescription>
<DocumentSize format="0.00 KB" isVisible="false">5403</DocumentSize>

XSD를 생성할 때 XSD에 모든 속성을 추가하는 방식으로 수동으로, 그리고 끔찍한 방식으로 수행할 수 있었습니다.

<xsd:element name="DocumentDescription" />
  <xsd:complexType>
    <xsd:simpleContent>
      <xsd:extension base="xsd:string">
        <xsd:attribute name="format" type="xsd:string" />
        <xsd:attribute name="isVisible" type="xsd:boolean" />
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
<xsd:element name="DocumentDateTime" />
   ... etc

...하지만 이상적인 세상에서는 복잡한 유형으로 정의하고 싶습니다.

<xsd:complexType name="customType">
  <xsd:complexContent>
    <xsd:extension base="???">
      <xsd:attribute name="format" type="xsd:string" />
      <xsd:attribute name="isVisible" type="xsd:boolean" />

그 말은 내가 할 수 있다는 뜻입니다

<xsd:element name="DocumentDescription" type="customType" baseType="xsd:string" />
<xsd:element name="DocumentDateTime" type="customType" baseType="xsd:dateTime" />
<xsd:element name="DocumentSize" type="customType" baseType="xsd:int" />

이상적인 세계 코드의 문제점은 다음과 같습니다.

a)저는 유효하지 않습니다.<xsd:extension base-"???">, 정말로 내가 무엇을 확장하는지 신경쓰지 않기 때문에, 나는 모든 타입을 확장하고 싶습니다."xsd:anyType"이 적절한 것 같은데 요소가 약하게 타이핑된 컨테이너가 되지 않습니까?

b)더 이상 단순 유형을 지정할 수 없습니다.<xsd:element>, 이제부터 유형은 복잡한 "custom"입니다.유형"이라고 정의했습니다.그래서 제가 상상의 "baseType" 속성을 넣었습니다.

그래서 단순한 유형에 속성을 비클런치 방식으로 추가할 수 있습니까?아니면 확장하는 단순한 유형을 제외하고 모두 동일한 12개의 복잡한 유형을 정의해야 합니까?

강체형 요소는 데이터를 좀 더 감각적으로 묘사할 뿐만 아니라 엑셀에서 XML 매핑에 사용할 때(이것이 바로 이런 것들의 전체적인 목적입니다), 강체형은 엑셀이 유형에 따라 셀 포맷을 올바르게 설정한다는 것을 의미합니다.

제가 잘못 보고 있는 것 같네요!어떤 조언이든 감사히 받겠습니다.

수동 솔루션의 어떤 측면이 끔찍하다고 생각하는지 완전히 명확하지는 않습니다. 단지 n개의 기본 유형을 확장해야 한다는 이유만으로 다른 유형을 정의해야 한다는 생각이라면, 여러분은 꼼짝 못하게 될 것입니다.

그것이 다른 선언을 해야 한다는 생각이라면.format그리고.isVisible그러면 다음 정의를 유지하기 위해 명명된 속성 그룹을 사용하는 것이 덜 끔찍하다고 느낄 수 있습니다.

<xs:attributeGroup name="globals">
  <xs:attribute name="format" type="xs:string"/>
  <xs:attribute name="isVisible" type="xs:boolean"/>
</xs:attributeGroup>

필요한 다양한 복잡한 유형의 선언은 반복성을 유지하지만 이제는 약간 덜 장황합니다.

<xs:complexType name="string">
  <xs:simpleContent>
    <xs:extension base="xs:string">
      <xs:attributeGroup ref="my:globals"/>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>
<xs:complexType name="dateTime">
  <xs:simpleContent>
    <xs:extension base="xs:dateTime">
      <xs:attributeGroup ref="my:globals"/>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>
<xs:complexType name="int">
  <xs:simpleContent>
    <xs:extension base="xs:int">
      <xs:attributeGroup ref="my:globals"/>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>

그리고 당신의 요소들의 선언은 이제 당신의 '이상적인' 경우보다 약간 더 간단해졌습니다.

<xs:element name="DocumentDescription" type="my:string" />
<xs:element name="DocumentDateTime" type="my:dateTime" />
<xs:element name="DocumentSize" type="my:int" />

[quote]는 XSD를 생성할 때 XSD에 이러한 모든 속성을 추가함으로써 수동으로 수행할 수 있습니다. [/quote]

유감스럽게도 이것이 당신이 할 수 있는 유일한 "적절한" XSD-schema 호환 방법입니다.

XSD는 때때로 작성자에게 복잡해질 수 있지만 안전을 유지하는 데 도움이 됩니다 :-)

마크

XSD의 목적은 데이터를 설명하는 것입니다.XSD의 유형 속성의 목적은 요소를 설명하거나 정의하는 것입니다.요소의 정의를 변경할 수 있습니다.설명을 변경하는 경우 유형을 변경합니다.당신이 하려는 일은 생각에 바퀴를 다는 것과 같습니다.「그렇지만 나는 내 생각에 의지하고 싶어!」 「미안해, 그럴 수 없어.」

언급URL : https://stackoverflow.com/questions/653158/xsd-adding-attributes-to-strongly-typed-simple-elements

반응형