2017-02-12 2 views
3

Я пытаюсь понять правильное поведение относительных URI идентификаторов системы. Во-первых, позвольте мне процитировать спецификации:Поведение относительных URI в XML, когда источником объявления является текст замены объекта параметра

4.2.2 Внешние сущности

[...]

[Расположение ресурса, внутри которого происходит объявление сущности] определяется быть внешний объект, содержащий «<», который начинает объявление, в момент, когда он анализируется как объявление.

URI, таким образом, может относиться к объекту документа, к объекту, содержащему внешний подмножество DTD, или к некоторому другому объекту внешнего параметра. [...]

В первом чтении я думал, что эти два утверждения противоречивы. Мне казалось, что разбор любого текста «как объявление» может происходить только в двух контекстах: внутреннем подмножестве или внешнем подмножестве. Естественно, это вытекает из того факта, что разыменование/расширение объекта рекурсивно. Итак, как же «какой-то другой внешний объект параметра» когда-либо был тем, к которому относится идентификатор?

Для того, чтобы оба утверждения были истинными, возможно, фраза «точка, когда она разобрана» просто не означает, что я это понимал. Может ли пункт «здесь» ссылаться вместо этого на любой контекст, определяющий исходный текст?

Я приведу пример, который может помочь сделать этот вопрос более неотложным.

Во-первых, наш документ. Это может быть где угодно, поскольку внешний DTD, который он ссылается, использует абсолютный URL-адрес для идентификатора системы.

FILE: doc.xml 

    <!DOCTYPE foo SYSTEM "http://dotcom.xml/foo.dtd"> 
    ... 

Так на очереди является DTD - однозначно можно найти на http://dotcom.xml/foo.dtd:

FILE: http://dotcom.xml/foo.dtd 

    <!ENTITY % bar SYSTEM "bar/bar.ent"> 
    %bar; 

еще ничего неоднозначным. Понятно, что наш следующий ресурс должен быть найден в http://dotcom.xml/bar/bar.ent

FILE: http://dotcom.xml/bar/bar.ent 

    <!ENTITY % baz SYSTEM "baz/baz.ent"> 
    %baz; 

Но вот где я неуверен. Учитывая, что спецификация специфически заявляет, что путь может относиться к внешнему объекту параметра, единственное, о чем я могу думать, это то, что здесь абсолютный путь для объекта baz должен быть http://dotcom.xml/bar/baz/baz.ent.

Это казалось странным для меня, потому что содержимое внешнего объекта параметра, помимо текстового объявления, представляет собой просто кусок текста, контекст и смысл которого неизвестны до более позднего времени, когда (и if) он ссылается либо на внутреннюю или внешнее подмножество. Но это не сумасшествие - достаточно проследить происхождение.

Но почему же спецификация квалифицирует свое утверждение с «в точке, когда он разобран»? Ну, это может быть, что это отличается:

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 независимо от того, сколько между ними промежуточных объектов существует между baz.

Поэтому я ищу, чтобы понять две вещи:

  1. Выше, что правильный абсолютный URL для "baz/baz.ent"?

  2. a. Если это http://dotcom.xml/bar/baz/baz.ent, почему спецификация говорит «в точке, где она разбирается»?

    b. Если это http://dotcom.xml/baz/baz.ent, почему спецификация говорит «или какой-либо другой внешний объект параметра»?

ответ

2

Хороший вопрос (ы).

В отличие от моего уважаемого соредактора, я не думаю, что это угловой корпус на ; многие публичные 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 '&#x003C;!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, почему спецификация говорит «или какой-либо другой внешний объект параметра»?

Это не так, и спецификация говорит «или каким-либо другим внешним параметрам сущности» частично, чтобы пояснить, что это не так.

+0

Ничего себе, спасибо! Это прояснило не только мой конкретный вопрос, но и помогло прояснить мое понимание терминологии, используемой спецификацией во многих других местах. например в то время как я понял аргументацию «все внешние объекты параметров хорошо сформированы по определению», я все еще был озадачен тем, почему не было явного производства, например. 'TextDecl? char * '- теперь я вижу, что во всех спецификациях PE обрабатываются так, как будто они читаются и анализируются во время использования. [...] – Semicolon

+0

[...] Это * * верно, но на практике я читал textDecl и кешировал (пока еще нерассмотренный) остаток при первом использовании для эффективности, и я не был должным образом разделен эта внеполосная деталь реализации из моего чтения спецификации, следовательно, я обсуждаю капли текста и т. д. – Semicolon

1

Ouf, это угловой корпус. Я думаю, мы можем согласиться с тем, что не имеет значения, где вы ссылаетесь на% baz; из. Я уверен, что намерение заключается в том, что «относительный» должен означать «относительно файла, в котором появляется объявление». Поскольку мы редко, как никогда, не слышим жалоб на взаимодействие между одним процессором XML и другим (Yay), я уверен, все они делают то же самое, и я надеюсь, что это то, что есть. Но я не тестировал.

Смежные вопросы