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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top