คำสั่ง 'แบบสแตนด์อโลน' หมายถึงอะไรใน XML


คำตอบ:


203

standaloneประกาศวิธีการบอกตัวแยกวิเคราะห์ที่จะไม่สนใจการประกาศมาร์กอัปใด ๆ ในที่DTD หลังจากนั้นจะใช้ DTD เพื่อการตรวจสอบความถูกต้องเท่านั้น

เป็นตัวอย่างให้พิจารณา<img>แท็กที่อ่อนน้อมถ่อมตน หากคุณดูXHTML 1.0 DTDคุณจะเห็นการประกาศมาร์กอัพบอกตัวแยกวิเคราะห์ว่า<img>แท็กจะต้องว่างเปล่าและมีsrcและaltคุณสมบัติ เมื่อเบราว์เซอร์กำลังอ่านเอกสาร XHTML 1.0 และพบ<img>แท็กก็ควรสังเกตว่า DTD ต้องการsrcและaltแอตทริบิวต์และเพิ่มพวกเขาหากพวกเขาไม่อยู่ มันจะปิด<img>แท็กด้วยตนเองเนื่องจากคาดว่าจะว่างเปล่า นี่คือความหมายของข้อกำหนด XMLโดย "การประกาศมาร์กอัปอาจมีผลต่อเนื้อหาของเอกสาร" จากนั้นคุณสามารถใช้การstandaloneประกาศเพื่อบอกให้ parser ละเว้นกฎเหล่านี้

ไม่ว่า parser ของคุณจะเป็นคำถามอื่นหรือไม่ แต่ควรใช้ parser ที่ตรวจสอบความถูกต้องตามมาตรฐาน (เช่นเบราว์เซอร์)

โปรดทราบว่าหากคุณไม่ได้ระบุ DTD ดังนั้นการประกาศแบบสแตนด์อโลน "ไม่มีความหมาย" ดังนั้นจึงไม่มีเหตุผลที่จะใช้มันเว้นแต่คุณจะระบุ DTD ด้วย


9
ตัวอย่างต้องการการแก้ไขเพิ่มเติม การมี "standalone = 'no'" ตามปกติจะไม่ปิดแท็ก XML ที่ไม่มีการปิดบัง (นี่คือคุณสมบัติของ SGML แต่ไม่ใช่ของ XML) การตรวจสอบจะล้มเหลว มันจะไม่ให้ค่าสำหรับคุณลักษณะที่จำเป็นเช่นกัน
khaemuaset

2
"การประกาศแบบสแตนด์อโลนเป็นวิธีการบอกให้ parser ละเว้นการประกาศมาร์กอัพใด ๆ ใน DTD" นั่นไม่ถูกต้อง ด้วยstandalone=yesการประกาศมาร์กอัพจะไม่ถูกละเว้น แต่จะทำให้เอกสารเป็น XML ที่ไม่ถูกต้อง คุณจะรังเกียจไหมถ้าฉันแก้ไขมันลงในคำตอบ?
sleske

@sleske เพียงแค่ทำการเปลี่ยนแปลง ผู้เขียนอาจเปลี่ยนกลับหากเขา / เธอไม่พอใจ
เตฟาน

@ สเตฟาน: ขอบคุณสำหรับกำลังใจ น่าเสียดายที่ฉันไม่ได้ใช้เนื้อหา XML ทั้งหมดอีกต่อไปดังนั้นฉันจึงไม่สามารถแก้ไขได้อย่างมั่นใจในขณะนี้ อย่าลังเลที่จะแก้ไขด้วยตัวคุณเองถ้าคุณมีความรู้ที่ทันสมัย ​​:-)
sleske

106
  • คำสั่งแบบสแตนด์อโลนเป็นคุณลักษณะที่เป็นตัวเลือกในการประกาศ XML
  • ค่าที่ถูกต้องคือyesและnoที่ไหนnoเป็นค่าเริ่มต้น
  • แอตทริบิวต์ที่มีความเกี่ยวข้องเฉพาะเมื่อDTDถูกนำมาใช้ (แอตทริบิวต์ไม่เกี่ยวข้องเมื่อใช้สคีมาแทน DTD)
  • standalone="yes"หมายความว่าโปรเซสเซอร์ XML ต้องใช้ DTD เพื่อการตรวจสอบความถูกต้องเท่านั้น ในกรณีนั้นมันจะไม่ถูกใช้สำหรับ:
    • ค่าเริ่มต้นสำหรับคุณลักษณะ
    • ประกาศนิติบุคคล
    • การฟื้นฟู
  • โปรดทราบว่าstandalone="yes"อาจเพิ่มข้อ จำกัด ความถูกต้องหากเอกสารใช้ DTD ภายนอก เมื่อเอกสารที่มีสิ่งที่จะต้องมีการปรับเปลี่ยนของ XML เช่นค่าเริ่มต้นสำหรับแอตทริบิวต์และstandalone="yes"ถูกนำมาใช้แล้วเอกสารไม่ถูกต้อง
  • standalone="yes" อาจช่วยเพิ่มประสิทธิภาพการประมวลผลเอกสารให้สูงสุด

แหล่งที่มา: แอ็ตทริบิวต์หลอกแบบสแตนด์อโลนมีความเกี่ยวข้องเฉพาะถ้าใช้ DTD


2
การใช้แบบสแตนด์อโลน = "ใช่" ทำให้เกิดข้อ จำกัด ด้านความถูกต้องเพิ่มเติม (เช่นอาจทำให้เอกสาร XML ไม่ถูกต้อง) ฉันแก้ไขสิ่งนี้เป็นคำตอบหวังว่าไม่เป็นไร
sleske

2
@sleske ขอบคุณสำหรับการสนับสนุนของคุณ ฉันพยายามทำให้การแก้ไขของคุณง่ายขึ้นในขณะที่ยังคงระบุจุดของคุณอย่างชัดเจน รู้สึกอิสระที่จะแก้ไขอีกครั้งถ้าฉันทำผิด
Rinke


10

การประกาศมาร์คอัปสามารถส่งผลกระทบต่อเนื้อหาของเอกสารตามที่ส่งผ่านจากตัวประมวลผล XML ไปยังแอปพลิเคชัน ตัวอย่างคือค่าเริ่มต้นของแอตทริบิวต์และการประกาศเอนทิตี การประกาศเอกสารแบบสแตนด์อโลนซึ่งอาจปรากฏขึ้นเป็นส่วนประกอบของการประกาศ XML ส่งสัญญาณว่ามีการประกาศดังกล่าวซึ่งปรากฏภายนอกองค์กรหรือในหน่วยงานพารามิเตอร์ [คำจำกัดความ: การประกาศมาร์กอัปภายนอกถูกกำหนดให้เป็นการประกาศมาร์กอัปที่เกิดขึ้นในเซ็ตย่อยภายนอกหรือในเอนทิตีพารามิเตอร์ (ภายนอกหรือภายในซึ่งภายหลังถูกรวมไว้เพราะโปรเซสเซอร์ที่ไม่ผ่านการตรวจสอบไม่จำเป็นต้องอ่าน)

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


12
นั่นหมายความว่าอย่างไร?
แดนคา

4
ฉันลงคะแนนเนื่องจากสิ่งนี้ควรทำให้มนุษย์ธรรมดาทั่วไปเข้าใจด้วยสื่อ QI
Andrea Silvestri

8

จุดประสงค์ของการstandalone=yesประกาศคือเพื่อรับประกันว่าข้อมูลภายในเอกสารสามารถถูกดึงออกมาได้อย่างสุจริตใจโดยอิงจาก DTD ภายในเท่านั้นนั่นคือเอกสารสามารถ "ยืนอยู่คนเดียว" โดยไม่มีการอ้างอิงภายนอก การตรวจสอบความถูกต้องของเอกสารแบบสแตนด์อโลนทำให้มั่นใจได้ว่าตัวประมวลผลที่ไม่ผ่านการตรวจสอบจะมีข้อมูลทั้งหมดที่สามารถแยกวิเคราะห์เอกสารได้อย่างถูกต้อง

การประกาศแบบสแตนด์อโลนไม่มีวัตถุประสงค์หากเอกสารไม่มี DTD ภายนอกและ DTD ภายในไม่มีการอ้างอิงเอนทิตีของพารามิเตอร์เนื่องจากเอกสารเหล่านี้เป็นแบบสแตนด์อโลนโดยปริยาย

standalone=yesต่อไปนี้จะมีผลกระทบที่เกิดขึ้นจริงของการใช้

  • บังคับให้ตัวประมวลผลเกิดข้อผิดพลาดเมื่อแยกวิเคราะห์เอกสารด้วยการอ้างอิง DTD ภายนอกหรือการอ้างอิงเอนทิตีของพารามิเตอร์หากเอกสารมีการอ้างอิงไปยังเอนทิตีที่ไม่ได้ประกาศใน DTD ภายใน (ยกเว้นข้อความแทนที่ของเอนทิตีพารามิเตอร์ แยกวิเคราะห์นี้); amp, lt, gt, aposและquotเป็นเพียงข้อยกเว้น

  • เมื่อแยกวิเคราะห์เอกสารที่ไม่ได้ประกาศว่าเป็นแบบสแตนด์อโลนโปรเซสเซอร์ที่ไม่ผ่านการตรวจสอบจะมีอิสระในการหยุดการแยกวิเคราะห์ DTD ภายในทันทีที่พบการอ้างอิงเอนทิตีของพารามิเตอร์ การประกาศเอกสารในรูปแบบสแตนด์อโลนบังคับให้ตัวประมวลผลที่ไม่ผ่านการตรวจสอบเพื่อแยกวิเคราะห์การประกาศมาร์กอัปใน DTD ภายในแม้ว่าพวกเขาจะเพิกเฉยต่อการอ้างอิงเอนทิตีพารามิเตอร์อย่างน้อยหนึ่งรายการก็ตาม

  • บังคับให้การตรวจสอบตัวประมวลผลเกิดข้อผิดพลาดหากพบสิ่งใดสิ่งหนึ่งต่อไปนี้ในเอกสารและการประกาศที่เกี่ยวข้องอยู่ใน DTD ภายนอกหรือในข้อความการแทนที่เอนทิตีพารามิเตอร์:

    • คุณลักษณะที่มีค่าเริ่มต้นหากพวกเขาไม่ได้ให้ค่าของพวกเขาอย่างชัดเจน
    • อ้างอิงนิติบุคคล (นอกเหนือจากamp, lt, gt, aposและquot)
    • แอ็ตทริบิวต์ที่มีชนิดโทเค็นหากค่าของแอ็ตทริบิวต์จะถูกแก้ไขโดยการทำให้เป็นมาตรฐาน
    • องค์ประกอบที่มีเนื้อหาองค์ประกอบหากมีพื้นที่สีขาวเกิดขึ้นในเนื้อหา

ตัวประมวลผลที่ไม่ผ่านการตรวจสอบอาจพิจารณาดึง DTD ภายนอกและขยายการอ้างอิงเอนทิตีพารามิเตอร์ทั้งหมดสำหรับเอกสารที่ไม่ใช่แบบสแตนด์อโลนแม้ว่ามันจะไม่มีภาระผูกพันที่จะต้องทำเช่นนั้นการตั้งค่าstandalone=yesอาจช่วยปรับปรุงประสิทธิภาพสำหรับ มันอาจจะไม่สร้างความแตกต่าง)


คำตอบอื่น ๆ ที่นี่ไม่สมบูรณ์หรือไม่ถูกต้องความเข้าใจผิดหลักคือ

การประกาศแบบสแตนด์อโลนเป็นวิธีการบอกให้ parser ละเว้นการประกาศมาร์กอัพใด ๆ ใน DTD หลังจากนั้นจะใช้ DTD เพื่อการตรวจสอบความถูกต้องเท่านั้น

สแตนด์อะโลน = "ใช่" หมายความว่าโปรเซสเซอร์ XML ต้องใช้ DTD สำหรับการตรวจสอบความถูกต้องเท่านั้น

การประกาศเอกสารเป็นแบบสแตนด์อโลนจริง ๆ แล้วจะบังคับให้ตัวประมวลผลที่ไม่ผ่านการตรวจสอบความถูกต้องแยกวิเคราะห์การประกาศภายในโดยปกติแล้วจะต้องละเว้น (นั่นคือหลังจากการอ้างอิงเอนทิตีพารามิเตอร์ที่ละเว้น) ตัวประมวลผลที่ไม่ผ่านการตรวจสอบความถูกต้องจะต้องยังคงใช้ข้อมูลใน DTD ภายในเพื่อให้ค่าแอททริบิวต์เริ่มต้นและทำให้แอททริบิวโทเค็นปกติให้เป็นมาตรฐาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.