Entidades DTD vs XML Schema-Elements
Pergunta
Usando um documento DTD eu fiz o seguinte:
file.xsl:
<!DOCTYPE xsl:stylesheet[
<!ENTITY red "rgb(255,0,0)">
]>
<xsl:stylesheet>
[...]
<xsl:attribute name="color">&red;</xsl:attribute>
[...]
</xsl:stylesheet>
Eu queria mudar tudo para XML-Schema. Então, eu tentei:
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>
Agora analisar o arquivo via Xalan vermelho não é traduzido como na versão DTD. Onde está o meu erro? São Schema arquivos não ler durante o processo de análise?
Solução
O atributo fixed
em uma definição de elemento não dizer um analisador de fazer uma substituição de texto. Significa simplesmente que o valor do elemento deve ser sempre o mesmo.
Na verdade, eu acredito que sua XSLT está produzindo XML que não irá validar contra o seu esquema, uma vez que o valor do elemento <defs:red>
não é "rgb(255,0,0)
". Mesmo se você usou default
vez de fixed
, esta não é uma substituição de texto. Significa apenas que, se nenhum valor for especificado, quando o valor é consultado em uma instância DOM, você vai encontrar o conjunto valor para "rgb(255,0,0)
".
Outras dicas
Usando esquemas para declarar suas regras estruturais (em vez de DTD) não impede você de usar entidades.
A maneira pela qual você usa referências de entidade para substituir o teor declarado não muda.
Referências de entidade não precisa ser declarado apenas dentro de arquivos DTD. Você pode declarar-los em linha em seus arquivos 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