Czy relaxng może określić nieuporządkowany zestaw elementów o tej samej nazwie, ale różnych atrybutach?
Pracuję nad zautomatyzowaniem testowania API, które pobiera i zwraca XML, więc chcę przetłumaczyć udokumentowane dane powrotu API na schemat, na ile to możliwe. Wybrałem RelaxNG do tego zadania w oparciu o łatwość użycia i nauki.
Zanim wrzucę wszystkie informacje, oto pytanie:
Czy można opisać „nieuporządkowany zestaw elementów o tej samej nazwie, ale różnych atrybutach”?
Oto przykładowy obiekt, który mam problem z opisem:
<item>
<id>d395136e-d060-4a6e-887c-c0337dd7ad09</id>
<name>The item has a name</name>
<link rel="self" type="type1" href="url" />
<link rel="download" type="type2" href="url" />
<link rel="relatedData" type="type3" href="url" />
</item>
Obiekty łączące są tym, na czym się rozłączam. Oto problem:
Kolejność elementów wewnątrz elementu nie jest gwarantowana, więc próbuję umieścić wszystkie elementy<interleave>
Struktura.Będzie wiele<link>
elementy wewnątrz<item>
, z różnymi zestawami atrybutów (tj.<item>
MUSI mieć link „własny”, link „pobierz” i link „relatedData”, aby był ważny).Wymagany jest jeden typ każdego łącza, ale kolejność nie jest gwarantowana.Próbowałem opisać schemat w ten sposób:
<element name="item">
<interleave>
<element name="id"><text/></element>
<element name="name"><text/></element>
<ref name="selfLink"/>
<ref name="launchLink"/>
<ref name="thumbnailLink"/>
</interleave>
</element>
odniesienia „link” są zdefiniowane gdzie indziej tak:
<define name="selfLink">
<element name="link">
<attribute name="href"><text/></attribute>
<attribute name="rel"><value>self</value></attribute>
<attribute name="type"><value>type1</value></attribute>
</element>
</define>
Parser nie jest z tego zadowolony - od jinga dostajęerror: the element "link" can occur in more than one operand of "interleave"
. Widzę, co się dzieje, ale miałem nadzieję, że poradzi sobie z ideą „elementów o tej samej nazwie, ale różnych atrybutach” jako unikalnych przedmiotów.
Przeniesienie odnośników z przeplotu powoduje, że jest ono analizowane, ale będę czekał, aż walidator wysadzi, gdy kolejność zmieni się w zwróconych danych.
Jakieś pomysły, czy to niemożliwe? Czy istnieje problem związany z XML, który przetwarzam, który będzie wymagał przeniesienia niektórych z nich do wyższej logiki przetwarzania w mojej aplikacji testowej (ręczne sprawdzenie każdego typu łącza po uruchomieniu bardziej ogólnej weryfikacji XML?)