Сущности DTD против элементов XML-схемы - PullRequest
6 голосов
/ 30 июля 2009

Используя DTD для документов, я сделал следующее:

file.xsl:

<!DOCTYPE xsl:stylesheet[
  <!ENTITY red "rgb(255,0,0)">
]>

<xsl:stylesheet>
   [...]
   <xsl:attribute name="color">&red;</xsl:attribute>
   [...]
</xsl:stylesheet>

Я хотел изменить все на XML-схему. Итак, я попробовал:

file.xsd:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="red" type="xs:token" fixed="rgb(255,0,0)" />
</xsd:schema>

file.xsl:

<xsl:stylesheet
    xmlns:defs="http://www.w3.org/2001/XMLSchema-instance"
    defs:noNamespaceSchemaLocation="file.xsd">

    [...]
    <xsl:attribute name="color"><defs:red/></xsl:attribute>
    [...]
</xsl:stylesheet>

Теперь анализ файла через красный цвет Xalan не переводится, как в версии DTD. Где моя ошибка? Не читаются ли файлы схемы во время анализа?

Ответы [ 2 ]

6 голосов
/ 30 июля 2009

Атрибут fixed в определении элемента не говорит синтаксическому анализатору выполнить текстовую подстановку. Это просто означает, что значение элемента всегда должно быть одинаковым.

На самом деле, я считаю, что ваш XSLT создает XML, который не будет проверяться по вашей схеме, поскольку значение элемента <defs:red> не равно "rgb(255,0,0)". Даже если вы использовали default вместо fixed, это не текстовая подстановка. Это просто означает, что, если значение не указано, когда значение запрашивается в экземпляре DOM, вы найдете значение, установленное в «rgb(255,0,0)».

4 голосов
/ 30 июля 2009

Использование схем для объявления ваших структурных правил (а не DTD) не мешает вам использовать сущности.

Способ, которым вы используете ссылки на сущности для замены объявленного контента, не меняется.

Ссылки на сущности не нужно объявлять только в файлах DTD. Вы можете объявить их встроенными в свои XML-файлы.

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY red "rgb(255,0,0)">
]>
<foo>
  <bar color="&red;" /> 
</foo>

http://www.ibm.com/developerworks/xml/library/x-tipentref.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...