Сущности DTD против элементов XML-схемы
Используя 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 red не переводится, как в версии DTD. Где моя ошибка? Не читаются ли файлы схемы во время анализа?
2 ответа
fixed
Атрибут в определении элемента не говорит синтаксическому анализатору выполнить текстовую подстановку. Это просто означает, что значение элемента всегда должно быть одинаковым.
На самом деле, я считаю, что ваш XSLT производит XML, который не будет проверяться по вашей схеме, поскольку значение <defs:red>
элемент неrgb(255,0,0)
". Даже если вы использовали default
вместо fixed
это не текстовая подстановка. Это просто означает, что, если значение не указано, когда значение запрашивается в экземпляре DOM, вы найдете значение, установленное на "rgb(255,0,0)
".
Использование схем для объявления ваших структурных правил (а не 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