Saya mencoba membuat XSD, dan mencoba menulis definisi dengan persyaratan berikut:
- Izinkan elemen turunan yang ditentukan untuk muncul berapa kali (0 hingga tidak terbatas)
- Izinkan elemen anak berada dalam urutan apa pun
Saya melihat sekeliling dan menemukan berbagai solusi seperti ini :
<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>
Tapi dari apa yang saya pahami xs: pilihan masih hanya memungkinkan pemilihan elemen tunggal. Oleh karena itu, menyetel MaxOccurs menjadi tidak terbatas seperti ini hanya berarti bahwa "salah satu" dari elemen anak dapat muncul beberapa kali. Apakah ini akurat?
Jika solusi di atas tidak benar, bagaimana saya bisa mencapai apa yang saya sebutkan di atas dalam kebutuhan saya?
EDIT : Bagaimana jika persyaratannya adalah sebagai berikut?
- Elemen child1 child2 dapat muncul berapa kali (0 hingga tidak terbatas)
- Elemen harus dalam urutan apa pun
- Elemen child3 dan child4 harus muncul tepat satu kali.
Misalnya, xml ini valid:
<foo>
<child1> value </child1>
<child1> value </child1>
<child3> value </child3>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>
tapi ini bukan (anak hilang3)
<foo>
<child1> value </child1>
<child1> value </child1>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>
Formulasi alternatif dari pertanyaan yang ditambahkan dalam pengeditan selanjutnya tampaknya masih belum terjawab: bagaimana menentukan bahwa di antara anak-anak elemen, harus ada satu yang dinamai
child3
, satu namachild4
, dan nomor apa pun yang dinamaichild1
atauchild2
, tanpa batasan pada urutan di dimana anak-anak muncul.Ini adalah bahasa reguler yang dapat didefinisikan langsung, dan model konten yang Anda butuhkan adalah isomorfik ke ekspresi reguler yang mendefinisikan kumpulan string di mana angka '3' dan '4' masing-masing muncul tepat satu kali, dan angka '1' dan '2 'terjadi beberapa kali. Jika tidak jelas bagaimana menulis ini, mungkin membantu untuk memikirkan jenis mesin keadaan terbatas apa yang akan Anda bangun untuk mengenali bahasa seperti itu. Ini akan memiliki setidaknya empat keadaan berbeda:
Tidak peduli di negara bagian apa robot itu berada, '1' dan '2' dapat dibaca; mereka tidak mengubah status mesin. Dalam keadaan awal, '3' atau '4' juga akan diterima; di negara bagian menengah, hanya '4' atau '3' yang diterima; dalam keadaan akhir, baik '3' maupun '4' tidak diterima. Struktur ekspresi reguler paling mudah dipahami jika kita pertama kali mendefinisikan regex untuk subset bahasa kita di mana hanya '3' dan '4' yang muncul:
Untuk mengizinkan '1' atau '2' muncul beberapa kali di lokasi tertentu, kita dapat menyisipkan
(1|2)*
(atau[12]*
jika bahasa regex kita menerima notasi itu). Memasukkan ekspresi ini di semua lokasi yang tersedia, kita dapatkanMenerjemahkan ini ke dalam model konten sangatlah mudah. Struktur dasarnya setara dengan regex
(34)|(43)
:Memasukkan pilihan nol-atau-lebih
child1
danchild2
langsung:Jika kita ingin meminimalkan sebagian besar, kita dapat menentukan grup bernama untuk pilihan berulang
child1
danchild2
:Di XSD 1.1, beberapa batasan pada
all
-groups telah dicabut, jadi mungkin saja untuk mendefinisikan model konten ini secara lebih ringkas:Tapi seperti yang bisa dilihat dari contoh yang diberikan sebelumnya, perubahan pada
all
-group ini sebenarnya tidak mengubah kekuatan ekspresif bahasa; mereka hanya membuat definisi jenis bahasa tertentu lebih ringkas.sumber
Inilah yang akhirnya berhasil untuk saya:
sumber
Tidak. Pilihan terjadi secara individual untuk setiap "pengulangan"
xs:choice
yang terjadi karenamaxOccurs="unbounded"
. Oleh karena itu, kode yang Anda posting sudah benar, dan benar-benar akan melakukan apa yang Anda inginkan seperti yang tertulis.sumber
Anda harus menemukan bahwa skema berikut memungkinkan apa yang Anda usulkan.
Ini akan memungkinkan Anda untuk membuat file seperti:
Yang sepertinya cocok dengan pertanyaan Anda.
sumber
minOccurs
danmaxOccurs
dibatasi 1 untuk anak-anakxs:all
.Jika semua hal di atas tidak berfungsi, Anda mungkin sedang mengerjakan traksi EDI di mana Anda perlu memvalidasi hasil Anda terhadap skema HIPPA atau xsd kompleks lainnya dalam hal ini. Syaratnya, misalkan ada 8 segmen REF dan salah satunya harus muncul dalam urutan apapun dan juga tidak semuanya wajib, artinya anda boleh memilikinya dalam urutan mengikuti REF 1, REF 3, REF 2, REF 9. Dalam situasi default yang menerima EDI akan gagal, karena tipe kompleks default adalah
Situasinya bahkan menjadi rumit ketika Anda memanggil elemen Anda dengan refence dan kemudian elemen itu di tempat aslinya cukup kompleks. sebagai contoh:
Larutan:
Di sini hanya mengganti "urutan" dengan "semua" atau menggunakan "pilihan" dengan kombinasi min / maks tidak akan berfungsi!
Hal pertama ganti
"xs:sequence" with "<xs:all>"
Sekarang, Anda perlu membuat beberapa perubahan di mana Anda merujuk elemen, Pergi ke:*** Sekarang di segmen di atas tambahkan titik pemicu pada akhirnya seperti ini trigger_field = "REF01 _... nama lengkap .." trigger_value = "38" Lakukan hal yang sama untuk segmen REF lainnya di mana nilai pemicu akan berbeda seperti katakan "18 "," XX "," YY "dll .. sehingga info rekaman Anda sekarang terlihat seperti:
b:recordinfo structure="delimited" field.........Biztalk/2003" trigger_field="REF01_...complete name.." trigger_value="38">
Ini akan membuat setiap elemen unik, karena Semua segmen REF (contoh di atas) memiliki struktur yang sama seperti REF01, REF02, REF03. Dan selama validasi, validasi struktur baik-baik saja tetapi tidak membiarkan nilai-nilai berulang karena mencoba mencari nilai yang tersisa di REF pertama itu sendiri. Menambahkan pemicu akan membuat semuanya unik dan akan diteruskan dalam urutan dan kasus situasional apa pun (seperti gunakan 5 dari 9 dan tidak semua 9/9).
Semoga ini membantu Anda, karena saya menghabiskan hampir 20 jam untuk ini.
Semoga berhasil
sumber