Apa arti arahan 'mandiri' dalam XML?

272

Apa arti standalonearahan ' ' dalam dokumen XML?

Nick
sumber

Jawaban:

203

The standalonedeklarasi adalah cara untuk memberitahu parser untuk mengabaikan deklarasi markup dalam DTD . DTD selanjutnya digunakan hanya untuk validasi.

Sebagai contoh, perhatikan <img>tag sederhana . Jika Anda melihat XHTML 1.0 DTD , Anda melihat deklarasi markup yang memberitahukan parser bahwa <img>tag harus KOSONG dan memiliki srcdan altatribut. Ketika browser akan melalui dokumen XHTML 1.0 dan menemukan <img>tag, itu harus memperhatikan bahwa DTD memerlukan srcdan altatribut dan menambahkannya jika mereka tidak ada. Ini juga akan menutup sendiri <img>tag karena seharusnya KOSONG. Inilah yang dimaksud spesifikasi XML dengan "deklarasi markup dapat memengaruhi konten dokumen." Anda kemudian dapat menggunakan standalonedeklarasi untuk memberi tahu parser untuk mengabaikan aturan ini.

Apakah parser Anda benar-benar melakukan ini atau tidak, ini adalah pertanyaan lain, tetapi parser yang memvalidasi yang memenuhi standar (seperti browser) seharusnya.

Perhatikan bahwa jika Anda tidak menentukan DTD, maka deklarasi mandiri "tidak memiliki arti," jadi tidak ada alasan untuk menggunakannya kecuali Anda juga menentukan DTD.

nullability
sumber
9
Contohnya perlu modifikasi lebih lanjut. Memiliki "standalone = 'no'" biasanya tidak akan menutup tag XML yang tidak tertutup (ini adalah fitur SGML, tetapi bukan XML). Validasi akan gagal. Itu tidak akan memberikan nilai untuk atribut yang DIPERLUKAN, baik.
khaemuaset
2
"Deklarasi mandiri adalah cara untuk memberitahu parser untuk mengabaikan deklarasi markup dalam DTD." Itu tidak benar. Dengan standalone=yes, deklarasi markup tidak diabaikan, sebaliknya itu menyebabkan dokumen menjadi XML yang tidak valid. Apakah Anda keberatan jika saya mengeditnya menjadi jawaban?
sleske
@sleske Tolong buat perubahan. Penulis selalu dapat kembali jika dia tidak bahagia.
Stephan
@Stephan: Terima kasih atas dorongannya. Sayangnya, saya tidak lagi terkini tentang semua hal XML, jadi saya tidak dapat dengan percaya diri mengedit sekarang. Silakan mengedit diri sendiri jika Anda memiliki pengetahuan terkini :-).
sleske
106
  • Direktif mandiri adalah atribut opsional pada deklarasi XML.
  • Nilai yang valid adalah yesdan no, di mana nonilai default.
  • Atribut hanya relevan ketika DTD digunakan. (Atribut tidak relevan ketika menggunakan skema, bukan DTD.)
  • standalone="yes"berarti bahwa prosesor XML harus menggunakan DTD hanya untuk validasi. Dalam hal itu tidak akan digunakan untuk:
    • nilai default untuk atribut
    • deklarasi entitas
    • normalisasi
  • Catatan yang standalone="yes"dapat menambahkan batasan validitas jika dokumen menggunakan DTD eksternal. Ketika dokumen berisi hal-hal yang memerlukan modifikasi XML, seperti nilai default untuk atribut, dan standalone="yes"digunakan maka dokumen tersebut tidak valid .
  • standalone="yes" dapat membantu mengoptimalkan kinerja pemrosesan dokumen.

Sumber: Atribut semu mandiri hanya relevan jika DTD digunakan

Rinke
sumber
2
Menggunakan standalone = "yes" menyebabkan kendala validitas tambahan (yaitu dapat menyebabkan dokumen XML tidak valid). Saya mengedit ini menjadi jawabannya, harap tidak apa-apa.
sleske
2
@sleske Terima kasih atas kontribusi Anda. Saya mencoba menyederhanakan hasil edit Anda sambil tetap menyatakan maksud Anda dengan jelas. Jangan ragu untuk mengedit lagi jika saya salah.
Rinke
20

standalone menjelaskan apakah dokumen XML saat ini tergantung pada deklarasi markup eksternal.

W3C menjelaskan tujuannya dalam "Extensible Markup Language (XML) 1.0 (Fifth Edition)":

Stefan Gehrig
sumber
10

Deklarasi markup dapat memengaruhi konten dokumen, seperti diteruskan dari prosesor XML ke aplikasi; contohnya adalah atribut default dan deklarasi entitas. Deklarasi dokumen mandiri, yang dapat muncul sebagai komponen deklarasi XML, menandakan apakah ada deklarasi yang muncul di luar entitas dokumen atau di entitas parameter. [Definisi: Deklarasi markup eksternal didefinisikan sebagai deklarasi markup yang terjadi di subset eksternal atau dalam entitas parameter (eksternal atau internal, yang terakhir dimasukkan karena prosesor yang tidak memvalidasi tidak diharuskan untuk membacanya).]

http://www.w3.org/TR/xml/#sec-rmd

Chris Diver
sumber
12
Apa artinya?
dan carter
4
Saya tidak memilih karena ini harus dimengerti oleh manusia normal dengan QI menengah.
Andrea Silvestri
8

Maksud dari standalone=yesdeklarasi ini adalah untuk menjamin bahwa informasi di dalam dokumen dapat dengan setia diambil hanya berdasarkan DTD internal, yaitu dokumen dapat "berdiri sendiri" tanpa referensi eksternal. Memvalidasi dokumen mandiri memastikan bahwa prosesor yang tidak memvalidasi akan memiliki semua informasi yang tersedia untuk menguraikan dokumen dengan benar.

Deklarasi mandiri tidak berfungsi jika dokumen tidak memiliki DTD eksternal, dan DTD internal tidak memiliki referensi entitas parameter, karena dokumen-dokumen ini sudah tersirat berdiri sendiri.

Berikut ini adalah efek aktual penggunaan standalone=yes.

  • Memaksa prosesor untuk melempar kesalahan saat mem-parsing dokumen dengan DTD eksternal atau referensi entitas parameter, jika dokumen berisi referensi ke entitas yang tidak dinyatakan dalam DTD internal (dengan pengecualian teks pengganti entitas parameter karena prosesor yang tidak memvalidasi tidak diharuskan untuk uraikan ini); amp, lt, gt, apos, Dan quotadalah satu-satunya pengecualian

  • Ketika mem-parsing dokumen yang tidak dinyatakan sebagai standalone, prosesor yang tidak memvalidasi bebas untuk berhenti mem-parsing DTD internal segera setelah menemukan referensi entitas parameter. Mendeklarasikan dokumen sebagai gaya mandiri memaksa prosesor yang tidak memvalidasi untuk mengurai deklarasi markup di DTD internal bahkan setelah mereka mengabaikan satu atau lebih referensi entitas parameter.

  • Memaksa prosesor yang memvalidasi untuk melempar kesalahan jika salah satu dari yang berikut ditemukan dalam dokumen, dan deklarasi masing-masing berada di DTD eksternal atau dalam teks penggantian entitas parameter:

    • atribut dengan nilai default, jika mereka tidak memiliki nilainya disediakan secara eksplisit
    • referensi entitas (selain amp, lt,gt , apos, dan quot)
    • atribut dengan tipe tokenized, jika nilai atribut akan diubah oleh normalisasi
    • elemen dengan konten elemen, jika ada spasi putih di kontennya

Prosesor yang tidak memvalidasi dapat mempertimbangkan mengambil DTD eksternal dan memperluas semua referensi entitas parameter untuk dokumen yang tidak berdiri sendiri, meskipun tidak berkewajiban untuk melakukannya, yaitu pengaturan standalone=yessecara teoritis dapat meningkatkan kinerja untuk prosesor yang tidak memvalidasi (peringatan spoiler: mungkin tidak akan membuat perbedaan).


Jawaban lain di sini tidak lengkap atau salah, kesalahpahaman utamanya adalah itu

Deklarasi mandiri adalah cara untuk memberitahu parser untuk mengabaikan deklarasi markup dalam DTD. DTD selanjutnya digunakan hanya untuk validasi.

standalone = "yes" berarti prosesor XML harus menggunakan DTD hanya untuk validasi.

Justru sebaliknya, mendeklarasikan dokumen sebagai standalone sebenarnya akan memaksa prosesor yang tidak memvalidasi untuk menguraikan deklarasi internal yang biasanya harus diabaikan (yaitu yang setelah referensi entitas parameter diabaikan). Prosesor yang tidak memvalidasi masih harus menggunakan info dalam DTD internal untuk memberikan nilai atribut default dan menormalkan atribut yang di-token, karena ini tidak tergantung pada validasi.

pengguna657267
sumber