2009-07-29 11 views
5

utilizzando un documento in DTD ho fatto la seguente:Entità DTD vs XML-Schema Elementi

file.xsl:

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

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

volevo cambiare tutto per XML-Schema. Così ho provato:

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> 

Ora l'analisi del file tramite Xalan rosso non è tradotto, come nella versione DTD. Dov'è il mio errore? I file dello schema non vengono letti durante il processo di analisi?

Acclamazioni
Gen

+0

+1 per una domanda che è utile a me – KLE

risposta

5

L'attributo fixed in una definizione di elemento non racconta una parser di fare una sostituzione di testo. Significa semplicemente che il valore dell'elemento deve essere sempre lo stesso.

In effetti, credo che il tuo XSLT stia producendo XML che non verrà convalidato rispetto allo schema, dal momento che il valore dell'elemento <defs:red> non è "rgb(255,0,0)". Anche se hai utilizzato default anziché fixed, questa non è una sostituzione di testo. Significa solo che, se non viene specificato alcun valore, quando il valore viene interrogato in un'istanza DOM, troverai il valore impostato su "rgb(255,0,0)".

+1

+1 per significato preciso di "fisso" – KLE

3

Utilizzare gli schemi per dichiarare le regole strutturali (anziché DTD) non impedisce all'utente di utilizzare le entità.

Il modo in cui si utilizzano i riferimenti di entità per sostituire il contenuto dichiarato non cambia.

I riferimenti alle entità non devono essere dichiarati solo all'interno dei file DTD. Puoi dichiararli in linea nei tuoi file 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

+0

Ecco fatto ... Grazie gen – Jan

+0

+1 per bella risposta. Ho controllato il link che hai dato, è stato utile. Nel tuo esempio, la linea DOCTYPE non dovrebbe fare riferimento a "foo" anziché a "page". Non era un tipo cut-n-paste? – KLE

+0

@KLE sei corretto, era un errore di copia/incolla. Ho corretto l'esempio. –