Хороший вопрос (ы).
В отличие от моего уважаемого соредактора, я не думаю, что это угловой корпус на ; многие публичные DTD создают этот шаблон. Но я думаю, , что в обычных случаях, как этот, большинство синтаксических анализаторов XML получают правильный ответ .
Во-первых, некоторые общие моменты.
1 Общий принцип для разрешения относительных ссылок против базовой URI, грубо, что обычно базовый URI, что важно, так это база URI ресурса, внутри которого используется относительная ссылка.
2 Это работа с XML-спецификации, чтобы сказать, что это означает, что для относительного ресурса, найденного в объявлении объекта, чтобы быть «использованы» в соответствующем смысле, и где искать соответствующую базу URI. Ответ спекулянта дается в отрывке, который вы цитируете. Она составляет говоря, что относительная ссылка используется когда объявление параметра объекта , содержащий он обрабатывается как объявление параметров объекта, а не на другое время, и что базовый URI для использования являются базовыми URI из объект, в котором происходит PE-декларация.
3 Поскольку вы наблюдаете, что ссылки на PE рекурсивно расширяются, коллекция PE-ссылок, расширяемых в любой заданной точке в анализе , моделируется стеком. Базовый URI для любой заданной относительной ссылки является URI внешнего объекта в верхней части стека , когда анализируется объявление, содержащее эту относительную ссылку.
Я передам в молчании подробности о том, какие виды сущностей ссылки обрабатываются в какое время, а также мотивация для деталей; короткий немотивированный ответ заключается в том, что когда ссылки PE являются , содержащиеся в заменяющем тексте декларации, они должны быть незамедлительно изменены ; когда встречаются ссылки на общие сущности (так как они могут быть в тексте замены другого объекта), они не должны быть расширены: ; они должны быть расширены, если встречаются в , анализируя экземпляр документа, но не при разборе DTD.
Во-первых, наш документ. Это может быть где угодно, поскольку внешние DT12-ссылки DTD ссылаются на абсолютный URL-адрес для идентификатора системы.
FILE: doc.xml
Когда мы начинаем обработку этого файла, запись формы
#document
"Файл: //Users/semicolon/docs/doc.xml"
помещается в стек сущности, а соответствующий базовый URI для любых разрешений является «file: //Users/semicolon/docs/doc.xml».
Одним из следствий правил корректности XML является то, что когда мы закончим чтение этого объекта, и стек становится пустым, документ XML завершен.
<!DOCTYPE foo SYSTEM "http://dotcom.xml/foo.dtd">
...
Так на очереди является DTD - однозначно можно найти на http://dotcom.xml/foo.dtd:
FILE: http://dotcom.xml/foo.dtd
После того, как мы начинаем разбор этого внешнего подмножества, стек объект будет выглядеть примерно следующее:
и базовый URI для использования в Относительные резолюции «http://dotcom.xml/foo.dtd».
N.B. Оба объекта теперь находятся в стеке, строго говоря анонимный; для удобства я дал им имена, начинающиеся с «#» (до , избегая возможных конфликтов с именованными объектами), но это просто для удобства , потому что в сообщении проще ссылаться на «# dtd-external», чем «Этот ресурс вы указали на идентификатор SYSTEM в объявлении типа документа. "
<!ENTITY % bar SYSTEM "bar/bar.ent">
%bar;
еще ничего неоднозначным.Понятно, что наш следующий ресурс должен найти на http://dotcom.xml/bar/bar.ent
Ну, в зависимости от того, что вы имеете в виду под «рядом», это либо истинным, либо ложным . Если вы имеете в виду «после обработки http://dotcom.xml/foo.dtd, то затем обрабатываем http://dotcom.xml/bar/bar.ent», то это неверно. Файл .../bar.ent обрабатывается во время обработки .../foo.dtd, не после. Если вы имеете в виду «следующий объект, который должен быть нажат на объект , то стек представляет собой PE-бар», то это правда.
Если две строки вы Показанное начало файла «foo.dtd», и следуют дальнейшим декларации, Пе «бар» должен быть разобран и обрабатывается перед этими следующими объявлениями. Даже если ничего следует за ссылочной позицией PE bar; но пробел или EOF, строго , говорящий о внешнем параметре «bar» должен быть обработан сразу же, когда ссылка на него распознана, и, таким образом, до встречается следующее EOF.
Но я согласен с тем, что правильное разрешение относительной ссылки указывается абсолютная ссылка.
FILE: http://dotcom.xml/bar/bar.ent
После того, как мы начинаем чтение этой сущности, стек объект является:
и базовый URI для резолюций http://dotcom.xml/bar/bar.ent
<!ENTITY % baz SYSTEM "baz/baz.ent">
%baz;
Но вот где я неуверен. Учитывая, что спецификация конкретно заявляет, что путь может быть относительно внешнего объекта параметра , единственное, о чем я могу думать, это то, что здесь , абсолютный путь для объекта baz должен быть http://dotcom.xml/bar/baz/baz.ent.
Да.
Это казалось странным, потому что содержание внешнего параметра сущности, вне текста декларации, просто комок текст которого контекст и смысл не непознаваем до позже, когда (и если) это ссылаются либо на внутреннее, либо на внешнее подмножество. Но это не сумасшедший - отслеживание происхождение достаточно просто.
Для ссылок на параметр-сущность нет «позже» в том смысле, что вы означает, я думаю.(Я, разумеется, неправильно понимаю вас.) Ссылка расширена и проанализирована в точке распознавания. И в любом случае в примере как «bar», так и «baz» имеют в качестве внешних подмножеств . Но правила, которые вы цитируете из спецификации XML, имеют значение , что абсолютный URI для любого внешнего объекта параметра в принципе хорошо определен, независимо от того, ссылается оно или нет.
Но почему же спецификация квалифицирует свое утверждение с помощью «в точке , когда он разобран»? Ну, это может быть, что это разные:
FILE: http://dotcom.xml/foo.dtd
<!ENTITY % bar SYSTEM "bar/bar.ent">
%bar;
%baz;
FILE: http://dotcom.xml/bar/bar.ent
<!ENTITY % baz SYSTEM "baz/baz.ent">
Но это, кажется, не Работа. Я почти уверен, что это не означает, что относительный контекст сейчас отличается, потому что объявление < объекта все еще «произошло» в bar.ent. Спецификация специально вызывает это.
Согласен (думаю).
В самом деле, если расположение ссылки имело значение, то, казалось бы, должны всегда быть http://dotcom.xml/baz/baz.ent, поскольку фактическое расширение не занимает место «назад у себя дома» в foo.dtd независимо от того, сколько промежуточные объекты параметров между ним и базой.
Нет, расширение PE-ссылок происходит немедленно, в « », в котором они встречаются. Не имеет значения ни для чего , но сообщения об ошибках и абсолютизация относительных ссылок, возможно, но это понятно.
Ссылка на «пункт, когда анализируется PE-декларация» - это , предназначенный для покрытия случаев, подобных следующим. В одном из параметров объекта А мы имеем декларацию формы
<!ENTITY % chapdecl '<!ENTITY % chapters SYSTEM "chapters.dtd">'>
Это не декларация параметра объекта «главы», но декларации о «chapdecl» параметр объекта, содержащей декларации " главы.
В другом параметр объекта B, который встречается и обрабатывается позже, мы имеем опорный параметр Entity
%chapdecl;
Я прочитал спецификацию, как говорит нам о том, что относительная ссылка «chapters.dtd» относительна к базовому URI B, а не к A.
Я с облегчением увидел, что я пришел к такому же выводу несколько лет назад в http://cmsmcq.com/mib/?p=1289 (хотя программа, которую я работал на потом делает неправильные вещи в этом угловом случае).
Поэтому я ищу, чтобы понять две вещи:
Выше, что правильный абсолютный URL для «БАЗ/baz.ent»?
a. Если это http://dotcom.xml/bar/baz/baz.ent, почему спецификация говорит «в точке, где она разбирается»?
Это.
Спецификация говорит, что он делает в попытке (по-видимому, не вполне успешно), чтобы понять, что в соответствующей базе URI является , что в сущности Е, который содержит декларацию D, которая содержит Относительные R на «Баз /baz.ent».
Немного громоздкая формулировка также пытается сказать (я думаю), что в необычных (или патологических) случаях, как A/случае B выше, где фактическая строка, которая выглядит как объявление PE происходит в одном субъекте и правила синтаксического анализа говорят, что они распознаются и обрабатываются как объявление PE в другом объекте, это последний объект (B в примере ), базовый URI которого используется, а не тот, который содержит строку (A). A содержит строку, которая выглядит как объявление; B содержит (через расширение «chaddecl») . (Строго говоря, верхний объект в стеке сущности, когда декларация встречается это «chapdecl», но это не внешний объект, так что не сосчитать.)
В случае это помогает, антецеденту «это» в предложении «декларация», и мы говорим о точке, в которой анализируется декларация , а не точка, в которой анализируется текст замены объекта .
b. Если это http://dotcom.xml/baz/baz.ent, почему спецификация говорит «или какой-либо другой внешний объект параметра»?
Это не так, и спецификация говорит «или каким-либо другим внешним параметрам сущности» частично, чтобы пояснить, что это не так.
Ничего себе, спасибо! Это прояснило не только мой конкретный вопрос, но и помогло прояснить мое понимание терминологии, используемой спецификацией во многих других местах. например в то время как я понял аргументацию «все внешние объекты параметров хорошо сформированы по определению», я все еще был озадачен тем, почему не было явного производства, например. 'TextDecl? char * '- теперь я вижу, что во всех спецификациях PE обрабатываются так, как будто они читаются и анализируются во время использования. [...] – Semicolon
[...] Это * * верно, но на практике я читал textDecl и кешировал (пока еще нерассмотренный) остаток при первом использовании для эффективности, и я не был должным образом разделен эта внеполосная деталь реализации из моего чтения спецификации, следовательно, я обсуждаю капли текста и т. д. – Semicolon