XSD - 어떤 순서로든 요소를 몇 번이든 허용하는 방법?
저는 XSD를 작성하려고 하며, 다음과 같은 요구 사항을 포함하여 정의를 작성하려고 합니다.
- 지정한 하위 요소가 임의 횟수(0 ~ 제한 없음)로 나타나도록 허용
- 하위 요소 순서대로 허용
주변을 둘러본 결과 다음과 같은 다양한 솔루션이 발견되었습니다.
<xs:element name="foo">
<xsl:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="child1" type="xs:int"/>
<xs:element name="child2" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>
하지만 제가 알기로는 xs:choice는 여전히 단일 요소만 선택할 수 있습니다.따라서 MaxOccurs를 unbounded로 설정하면 하위 요소의 "아무나"가 여러 번 나타날 수 있습니다.이게 정확한 건가요?
만약 위의 해결책이 틀릴 경우, 제가 요구하는 사항에서 위에 말한 것을 어떻게 달성할 수 있습니까?
편집: 요구 사항이 다음과 같다면 어떻게 합니까?
- 요소 child1 child2는 횟수에 상관없이 나타날 수 있습니다(0 ~ 제한 없음).
- 순서에 상관없이 구성할 요소
- child3 및 child4 요소는 정확히 한 번만 나타납니다.
예를 들어, 이 xml은 유효합니다.
<foo>
<child1> value </child1>
<child1> value </child1>
<child3> value </child3>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>
하지만 이건 아닙니다. (missing 아이3)
<foo>
<child1> value </child1>
<child1> value </child1>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>
이후 않은 것으로 라는 을 가진 입니다. 요소의 자식 중에 이름이 있어야 한다는 것을 지정하는 방법입니다.child3, ㅇchild4, 그리고 이름이 붙은 어떤 이름으로child1아니면child2
이것은 쉽게 정의할 수 있는 정규 언어이며, 당신이 필요로 하는 내용 모델은 숫자 '3'과 '4'가 각각 정확히 한 번 발생하고 숫자 '1'과 '2'가 몇 번 발생하는 문자열의 집합을 정의하는 정규 표현식과 동형입니다.이 글을 어떻게 써야 할지 명확하지 않다면, 그런 언어를 인식하기 위해 어떤 종류의 유한 상태 기계를 만들 것인지 생각해 보는 것이 도움이 될 것입니다.적어도 네 가지의 상태가 있을 것입니다.
- '3'도 '4'도 보이지 않은 최초의 상태.
- '3'이 보였으나 '4'가 아닌 중간 상태
- '4'가 보였으나 '3'이 아닌 중간 상태
- '3'과 '4'가 모두 목격된 최종 상태.
오토마톤의 상태에 상관없이 '1'과 '2'를 읽을 수 있으며, 기계의 상태를 바꾸지 않습니다.처음 상태에서는 '3' 또는 '4'도 허용되고, 중간 상태에서는 '4' 또는 '3'만 허용되고, 마지막 상태에서는 '3' 또는 '4' 모두 허용되지 않습니다.정규 표현식의 구조는 '3'과 '4'만 발생하는 언어의 부분집합에 대한 정규 표현식을 먼저 정의하면 가장 쉽게 이해할 수 있습니다.
(34)|(43)
할 수 하려면 '1' 합니다 '2' 을 삽입합니다.(1|2)*(또는[12]*만약 우리의 정규 언어가 그 표기법을 받아들인다면.)한 모든 에 이 을 얻을 수
(1|2)*((3(1|2)*4)|(4(1|2)*3))(1|2)*
이것을 컨텐츠 모델로 변환하는 것은 간단합니다.다와 .(34)|(43):
<xsd:complexType name="paul0">
<xsd:choice>
<xsd:sequence>
<xsd:element ref="child3"/>
<xsd:element ref="child4"/>
</xsd:sequence>
<xsd:sequence>
<xsd:element ref="child4"/>
<xsd:element ref="child3"/>
</xsd:sequence>
</xsd:choice>
</xsd:complexType>
또는 그 항목을 합니다.child1그리고.child2
<xsd:complexType name="paul1">
<xsd:sequence>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
<xsd:choice>
<xsd:sequence>
<xsd:element ref="child3"/>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
<xsd:element ref="child4"/>
</xsd:sequence>
<xsd:sequence>
<xsd:element ref="child4"/>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
<xsd:element ref="child3"/>
</xsd:sequence>
</xsd:choice>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
하려면 의 할 수 child1그리고.child2:
<xsd:group name="onetwo">
<xsd:choice>
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
</xsd:group>
<xsd:complexType name="paul2">
<xsd:sequence>
<xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
<xsd:choice>
<xsd:sequence>
<xsd:element ref="child3"/>
<xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="child4"/>
</xsd:sequence>
<xsd:sequence>
<xsd:element ref="child4"/>
<xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="child3"/>
</xsd:sequence>
</xsd:choice>
<xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
XSD 1.1에 몇 사항all이 을 좀 더수 .
<xsd:complexType name="paul3">
<xsd:all>
<xsd:element ref="child1" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="child2" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="child3"/>
<xsd:element ref="child4"/>
</xsd:all>
</xsd:complexType>
알 수 의 는 ,all-그룹은 사실 언어의 표현력을 바꾸지 않습니다; 그들은 특정 종류의 언어에 대한 정의를 더 간결하게 만들 뿐입니다.
child1아니면child2순서, 횟수에 상관없이 나타날 수 있습니다.그래서 이것은 당신이 찾고 있는 것처럼 들립니다.
이 중 하나만 제한 없이 여러 번 나타나길 원한다면, 경계가 없는 요소는 대신 다음과 같은 요소를 사용해야 합니다.
<xs:element name="foo">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="child1" type="xs:int" maxOccurs="unbounded"/>
<xs:element name="child2" type="xs:string" maxOccurs="unbounded"/>
</xs:choice>
</xs:complexType>
</xs:element>
이것이 마침내 저에게 효과가 있었던 것입니다.
<xsd:element name="bar">
<xsd:complexType>
<xsd:sequence>
<!-- Permit any of these tags in any order in any number -->
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="child1" type="xsd:string" />
<xsd:element name="child2" type="xsd:string" />
<xsd:element name="child3" type="xsd:string" />
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
하지만 제가 알기로는 xs:choice는 여전히 단일 요소만 선택할 수 있습니다.따라서 MaxOccurs를 unbounded로 설정하면 하위 요소의 "아무나"가 여러 번 나타날 수 있습니다.이게 정확한 건가요?
은 의 ""에 개별적으로 .xs:choicemaxOccurs="unbounded" 대로 할 그러므로 당신이 게시한 코드가 맞으며, 실제로 당신이 원하는 대로 할 것입니다.
다음 스키마는 제안한 것을 허용한다는 것을 알아야 합니다.
<xs:element name="foo">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:choice>
<xs:element maxOccurs="unbounded" name="child1" type="xs:unsignedByte" />
<xs:element maxOccurs="unbounded" name="child2" type="xs:string" />
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
이렇게 하면 다음과 같은 파일을 만들 수 있습니다.
<?xml version="1.0" encoding="utf-8" ?>
<foo>
<child1>2</child1>
<child1>3</child1>
<child2>test</child2>
<child2>another-test</child2>
</foo>
당신의 질문과 일치하는 것 같네요.
위의 내용 중 어느 것도 제대로 작동하지 않는다면, 당신은 아마도 HIPA 스키마나 다른 복잡한 xsd에 대한 결과를 검증해야 하는 EDI 트랜잭션을 수행하고 있을 것입니다.이 요건은 8개의 REF 세그먼트가 있고, 그 중 어느 하나라도 순서대로 나타나야 하며, 전부가 필요한 것은 아니라는 것을 의미합니다. 즉, 1차 REF, 3차 REF, 2차 REF, 9차 REF 순서로 순서를 정할 수 있습니다.기본 상황에서는 기본 복합 유형이 다음과 같으므로 EDI가 수신하지 못합니다.
<xs:sequence>
<xs:element.../>
</xs:sequence>
심지어 당신이 당신의 요소를 참조로 부르고 그 원래 위치에 있는 그 요소 자체가 꽤 복잡할 때 상황은 복잡합니다.예를 들어 다음과 같습니다.
<xs:element>
<xs:complexType>
<xs:sequence>
<element name="REF1" ref= "REF1_Mycustomelment" minOccurs="0" maxOccurs="1">
<element name="REF2" ref= "REF2_Mycustomelment" minOccurs="0" maxOccurs="1">
<element name="REF3" ref= "REF3_Mycustomelment" minOccurs="0" maxOccurs="1">
</xs:sequence>
</xs:complexType>
</xs:element>
해결책:
여기서 단순히 "시퀀스"를 "모두"로 대체하거나 "선택"을 최소/최대 조합으로 사용하는 것은 작동하지 않습니다!
첫번째 것을 교체"xs:sequence" with "<xs:all>"요소를 참조하는 위치를 변경해야 합니다. 다음 항목을 변경해야 합니다.
<xs:annotation>
<xs:appinfo>
<b:recordinfo structure="delimited" field.........Biztalk/2003">
***이제 위 세그먼트에서 이 trigger_field=와 같이 마지막에 트리거 포인트를 추가합니다."REF01_...완전한 이름.." trigger_value = "38" 트리거 값이 "18", "XX", "YY" 등과 같이 다른 REF 세그먼트에서도 동일하게 수행합니다.이제 레코드 정보가 다음과 같이 표시되도록 합니다.b:recordinfo structure="delimited" field.........Biztalk/2003" trigger_field="REF01_...complete name.." trigger_value="38">
이렇게 하면 모든 REF 세그먼트(위의 예)가 REF01, REF02, REF03과 같은 구조를 가지므로 각 요소가 고유합니다.그리고 검증 중에 구조 검증은 괜찮지만 첫 번째 REF 자체에서 남은 값을 찾으려 하기 때문에 값이 반복되지 않습니다.트리거를 추가하면 모든 트리거가 고유하게 되며 모든 순서 및 상황에 따라 전달됩니다(예: 9/9가 아닌 5/9 사용).
도움이 되길 바랍니다. 거의 20시간을 들였으니까요.
행운을 빌어요
하위 요소가 거의 없는 경우 <xs:choice> 안에 가능한 모든 시퀀스를 나열할 수 있습니다.이를 통해 순서별로 원하는 유연성을 확보할 수 있습니다.N!은 매우 빠르게 성장하고 있기 때문에 최대 4개의 하위 요소에만 적합합니다.
언급URL : https://stackoverflow.com/questions/2290360/xsd-how-to-allow-elements-in-any-order-any-number-of-times
'programing' 카테고리의 다른 글
| Android용 모바일 웹 사이트(응용프로그램 아님)에서 WhatsApp의 공유 링크 (0) | 2023.09.24 |
|---|---|
| GOobject System은 왜 만들어졌습니까? (0) | 2023.09.24 |
| 신호R 2.0 오류: 파일 또는 어셈블리 Microsoft를 로드할 수 없습니다.오윈.보안 (0) | 2023.09.24 |
| node-gyp이란 무엇입니까? (0) | 2023.09.24 |
| SignalR 2.0 error: Could not load file or assembly Microsoft.Owin.Security (0) | 2023.09.24 |