Co oznacza „samodzielna” dyrektywa w XML?


272

Co oznacza standalonedyrektywa „ ” w dokumencie XML?

Odpowiedzi:


203

standaloneDeklaracja jest sposobem mówienia parser ignorować żadnych deklaracji znaczników w DTD . DTD jest następnie używany wyłącznie do sprawdzania poprawności.

Jako przykład rozważ skromny <img>tag. Jeśli spojrzysz na XHTML 1.0 DTD , zobaczysz deklarację znaczników informującą parser, że <img>tagi muszą być PUSTE oraz posiadać srci posiadać altatrybuty. Gdy przeglądarka przegląda dokument XHTML 1.0 i znajduje <img>znacznik, powinna zauważyć, że DTD wymaga srci altatrybuty, i dodaje je, jeśli nie są obecne. Sam również zamknie <img>tag, ponieważ ma być PUSTY. To właśnie specyfikacja XML oznacza „deklaracje znaczników mogą wpływać na treść dokumentu”. Następnie możesz użyć standalonedeklaracji, aby powiedzieć parserowi, aby zignorował te reguły.

To, czy parser faktycznie to robi, jest kolejnym pytaniem, ale powinien to zrobić zgodny z normami parser sprawdzający poprawność (jak przeglądarka).

Zauważ, że jeśli nie określisz DTD, wówczas samodzielna deklaracja „nie ma znaczenia”, więc nie ma powodu, aby z niej korzystać, chyba że podasz również DTD.


9
Przykład wymaga dalszej modyfikacji. Posiadanie „standalone = 'no'” normalnie nie zamykałoby niezamkniętych znaczników XML (jest to cecha SGML, ale nie XML). Sprawdzanie poprawności zakończy się niepowodzeniem. Nie dostarczy również wartości dla WYMAGANYCH atrybutów.
khaemuaset

2
„Samodzielna deklaracja jest sposobem na powiedzenie parserowi, aby zignorował wszelkie deklaracje znaczników w DTD.” To nie jest poprawne. Za pomocą standalone=yesdeklaracji znaczników nie są ignorowane, zamiast tego powodują, że dokument jest nieprawidłowy XML. Czy miałbyś coś przeciwko, jeśli zmienię to w odpowiedź?
sleske

@sleske Po prostu dokonaj zmiany. Autor może zawsze cofnąć, jeśli nie jest szczęśliwy.
Stephan

@Stephan: Dzięki za zachętę. Niestety, nie jestem już na bieżąco z całą sprawą XML, więc nie mogę teraz pewnie edytować. Jeśli masz aktualną wiedzę, możesz ją edytować samodzielnie :-).
sleske

106
  • Autonomiczna dyrektywa jest opcjonalnym atrybutem deklaracji XML.
  • Poprawne wartości to yesi no, gdzie nojest wartością domyślną.
  • Ten atrybut jest istotny tylko wtedy, gdy używany jest DTD . (Atrybut jest nieistotny w przypadku korzystania ze schematu zamiast DTD.)
  • standalone="yes"oznacza, że ​​procesor XML musi używać DTD tylko do sprawdzania poprawności. W tym przypadku będzie to nie być wykorzystywane do:
    • domyślne wartości atrybutów
    • deklaracje podmiotów
    • normalizacja
  • Pamiętaj, że standalone="yes"może dodać ograniczenia ważności, jeśli dokument używa zewnętrznego DTD. Gdy dokument zawiera rzeczy, które wymagałyby modyfikacji XML, takie jak domyślne wartości atrybutów, i standalone="yes"jest używany, wówczas dokument jest nieprawidłowy .
  • standalone="yes" może pomóc zoptymalizować wydajność przetwarzania dokumentów.

Źródło: Autonomiczny pseudo-atrybut jest istotny tylko wtedy, gdy użyto DTD


2
Użycie standalone = „yes” powoduje dodatkowe ograniczenia ważności (tzn. Może spowodować, że dokument XML będzie nieprawidłowy). Zredagowałem to w odpowiedzi, mam nadzieję, że to w porządku.
sleske

2
@sleske Dziękujemy za Twój wkład. Próbowałem uprościć twoją edycję, jednocześnie wyraźnie zaznaczając swój punkt widzenia. Jeśli popełniłem błąd, możesz go edytować ponownie.
Rinke


10

Deklaracje znaczników mogą wpływać na treść dokumentu przekazywanego z procesora XML do aplikacji; przykładami są domyślne wartości atrybutów i deklaracje encji. Autonomiczna deklaracja dokumentu, która może pojawić się jako składnik deklaracji XML, sygnalizuje, czy istnieją takie deklaracje, które pojawiają się na zewnątrz encji dokumentu lub encji parametrów. [Definicja: Zewnętrzna deklaracja znaczników jest zdefiniowana jako deklaracja znaczników występująca w podzbiorze zewnętrznym lub w encji parametrycznej (zewnętrznej lub wewnętrznej, ta ostatnia jest uwzględniona, ponieważ procesory nie sprawdzające poprawności nie są wymagane do ich odczytania).]

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


12
Co to znaczy?
dan carter

4
Odrzuciłem głos, ponieważ należy to ująć w sposób zrozumiały dla normalnych ludzi o średnim QI.
Andrea Silvestri

8

Celem standalone=yesdeklaracji jest zagwarantowanie, że informacje zawarte w dokumencie mogą być wiernie odzyskane tylko na podstawie wewnętrznego DTD, tzn. Dokument może być „samodzielny” bez żadnych zewnętrznych odniesień. Sprawdzanie poprawności samodzielnego dokumentu zapewnia, że ​​procesory nie sprawdzające poprawności będą miały wszystkie informacje dostępne do prawidłowego parsowania dokumentu.

Deklaracja autonomiczna nie ma żadnego sensu, jeśli dokument nie ma zewnętrznego DTD, a wewnętrzny DTD nie ma odwołań do encji parametrów, ponieważ dokumenty te są już domyślnie autonomiczne.

Poniżej przedstawiono rzeczywiste efekty używania standalone=yes.

  • Zmusza procesory do zgłaszania błędu podczas analizowania dokumentów z zewnętrznym DTD lub odwołaniami do encji parametrycznych, jeśli dokument zawiera odniesienia do encji niezadeklarowanych w wewnętrznym DTD (z wyjątkiem tekstu zastępczego encji parametrycznych, ponieważ procesory nie walidujące nie muszą parsuj to); amp, lt, gt, apos, I quotsą jedynymi wyjątkami

  • Podczas analizowania dokumentu, który nie został zadeklarowany jako samodzielny, nie sprawdzający poprawności procesor może przestać analizować wewnętrzny DTD, gdy tylko napotka odniesienie do encji parametru. Zadeklarowanie dokumentu jako samodzielnego zmusza nie-walidujące procesory do analizowania deklaracji znaczników w wewnętrznym DTD, nawet po zignorowaniu jednego lub więcej odwołań do encji parametrycznych.

  • Zmusza procesory sprawdzające do zgłaszania błędu, jeśli w dokumencie znaleziono którekolwiek z poniższych stwierdzeń, a ich odpowiednie deklaracje znajdują się w zewnętrznym DTD lub w tekście zastępującym encję parametru:

    • atrybuty z wartościami domyślnymi, jeśli nie mają wyraźnie podanej wartości
    • encje (inne niż amp, lt, gt, aposi quot)
    • atrybuty z typami tokenizowanymi, jeśli wartość atrybutu zostanie zmodyfikowana przez normalizację
    • elementy z zawartością elementu, jeśli w ich treści występuje jakaś biała spacja

Procesor niezweryfikujący może rozważyć pobranie zewnętrznego DTD i rozszerzenie wszystkich odniesień do encji parametrycznych dla dokumentów, które nie są samodzielne, nawet jeśli nie jest to do tego zobowiązane, tj. Ustawienie standalone=yes może teoretycznie poprawić wydajność procesorów nie sprawdzających poprawności (alert spoilera: prawdopodobnie nie będzie to miało znaczenia).


Inne odpowiedzi tutaj są niekompletne lub niepoprawne, główne nieporozumienie jest takie

Autonomiczna deklaracja jest sposobem na poinformowanie analizatora składni, aby zignorował wszelkie deklaracje znaczników w DTD. DTD jest następnie używany wyłącznie do sprawdzania poprawności.

standalone = „yes” oznacza, że ​​procesor XML musi używać DTD tylko do sprawdzania poprawności.

Wręcz przeciwnie, zadeklarowanie dokumentu jako samodzielnego zmusi procesor nie sprawdzający poprawności do parsowania wewnętrznych deklaracji, które musi normalnie zignorować (tj. Te po odwołaniu do zignorowanej jednostki encji parametru). Procesory, które nie sprawdzają poprawności, muszą nadal korzystać z informacji z wewnętrznego DTD, aby podać domyślne wartości atrybutów i znormalizować atrybuty tokeny, ponieważ jest to niezależne od sprawdzania poprawności.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.