Технология XSLT - страница 20
>
Для того чтобы использовать содержимое этого файла в документе, мы должны объявить внешнюю сущность следующим образом:
>
где >ent/animal
есть относительный путь до файла >animal.ent
. Если бы мы расположили файл на сервере, скажем, >www.animalhost.com
, сущность могла бы быть объявлена как
>
В документе ссылаться на объявленную внешнюю сущность мы будем точно так же, как ссылались бы на внутреннюю сущность:
>
>
>
>]>
>
>
> Продается &animal; весом > 5 тонн!
> Рождественские скидки!
>
>
В этом случае элемент >product
будет иметь текст
>Продается огромное серое животное весом > 5 тонн!
>Рождественские скидки!
Внешняя сущность может быть также объявлена при помощи так называемого публичного идентификатора. В этом случае, при объявлении указывается не только местоположение сущности, но еще и идентификатор, который предоставляет программному обеспечению, обрабатывающему документ, некоторую дополнительную информацию. Например, в некоторых случаях XML-процессор может уже включать в себя определение внешней сущности, и ему не нужно будет получать содержимое файла, находящегося на удаленном сервере.
Такой способ определения внешней сущности имеет следующий синтаксис:
>имя PUBLIC "идентификатор" "URL">
Например, сущность >animal
мы можем переопределить как
>
> "http://www.animalhost.com/animal.ent">
Специальный процессор зоологических XML-файлов, встретив публичный идентификатор >-//ZOO//Elephant//Description
поймет, что речь идет о слоне, и не станет загружать файл >animal.ent
с удаленного сервера, вставив собственное описание слона.
Подводя итог, можно выделить следующие случаи, когда следует использовать сущности:
□ замена часто повторяющихся частей документа;
□ разбивка одного XML-документа на отдельные модули;
□ замена некоторых символов, которые иначе были бы восприняты, как разметка;
□ использование символов с соответствующими кодами Unicode.
Синтаксис использования сущностей в тексте документа довольно прост. Символьная сущность определяется продукцией >CharRef
следующим образом:
>[66] CharRef ::= '' [0-9]+ ';' | "' [0-9a-fA-F]+ ';'
>CharRef
— это либо десятичная, либо шестнадцатеричная символьная сущность. В первом случае вместо имени сущности стоит набор, цифр от >0
до >9
, во втором — к этому набору добавляются буквы >a
, >b
, >c
, >d
, >e
, >f
в любом регистре символов. Ведущие нули не имеют никакого значения, >х0020;
точно так же, как и >х20;
соответствует пробельному символу.
Обычной сущности, объявленной внутри или вне документа, соответствует продукция >EntityRef
:
>[68] EntityRef ::= '&' Name
Символьная и обычная сущности объединяются в продукцию >Reference
:
>[67] Reference ::= EntityRef | CharRef
Здесь следует сделать небольшое отступление и сказать о том, что конструкции вида >&имя;
или >код;
, о которых мы говорили как о сущностях, на самом деле являются не сущностями, а ссылками на сущности. >код;
— это ссылка на символьную, а >&имя;
— на обычную сущность. Сама сущность — это именованный объект, к которому обрабатывающая программа должна обращаться при обработке ссылки с соответствующим именем. Однако, поскольку связь между сущностью и ссылкой на нее однозначна (одно не существует без другого), сами ссылки очень часто называют сущностями. Название продукции >Reference
переводится с английского как "ссылка", но пониматься в данном контексте может, в том числе, и как сущность.
Определение обычной сущности соответствует следующей продукции:
>[71] GEDecl ::= ''
>Name
, как обычно, определяет имя, a >EntityDef
, соответственно, значение сущности. Это значение может быть задано как внутри документа (первый вариант выбора, >EntityValue
), так и вне его (второй вариант, >ExternalID NDataDecl?
).
>[73] EntityDef ::= EntityValue | (ExternalID NDataDecl?)
>EntityValue
— это всего лишь символьное значение, взятое в кавычки.