Errore fatale! Durante XSL trasformazione
Domanda
Sto usando DITA OT per trasformare l'XML in XHTML. Il mio aspetto XSL come
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE some_name [
<!ENTITY nbsp " ">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:saxon="http://icl.com/saxon" extension-element-prefixes="saxon">
<xsl:import href="../map2xhtmtoc.xsl"/>
<!--<xsl:import href="result-doc.xsl"/>-->
<!--<xsl:import href="custom-ecollege-dita2xhtml.xsl"/>-->
<xsl:output name="html" method="html" indent="yes" encoding="UTF-8"/>
<!-- Define a newline character -->
<xsl:variable name="newline">
<xsl:text>
</xsl:text>
</xsl:variable>
<xsl:template match="/">
<html>
<head>
<body>
<xsl:apply-templates select="myProduct"/>
</body>
</head>
</html>
</xsl:template>
<!--other templates goes here-->
<div class="floatRight"/>
<div class="headerSeparator">
<xsl:text disable-output-escaping="yes">&nbsp;</xsl:text>
</div>
</xsl:template>
</xsl:stylesheet>
Ora, se ho cercato di eseguire questo xsl contro il mio xml per la trasformazione xhtml utilizzando DITA OT vaso cmd.
java -jar .\lib\dost.jar /i:samples/mycompany/myContent/myContent.ditamap /transtype:xhtml /xsl:xsl/mycompany/custom-map2xhtml.xsl
Dopo l'esecuzione del comando precedente, sto ottenendo il seguente errore.
[xslt] D:\DITA-OT1.5.2\xsl\mycompany\custom-map2xhtm.xsl:21: Fatal Error! When 'standalone' or 'doctype-system' is specified, the document must be well-formed; but this document contains a top-level text node
[xslt] Failed to process null
Am rompendo la testa per scoprire perché questo errore è in corso.
Grazie.
Soluzione
this document contains a top-level text node
Ci può indicare la fine del foglio di stile XSLT? C'è qualche testo dopo il </xsl:stylesheet>
finale? Che potrebbe causare questo errore.
Aggiorna
Come Dimitre sottolineato, l'inizio <xsl:template>
/ tag di chiusura sono sbilanciati, quindi a meno che non si sta mostrando solo una parte della vostra XSLT, che deve essere fissato.
Tuttavia, sono d'accordo con @ Tim C che probabilmente non si vuole veramente una dichiarazione DOCTYPE a tutti nel vostro XSLT. Non stai cercando di utilizzare l'entità
nel foglio di stile, si sta solo cercando di emettere una. Quindi, se è stata rimossa la dichiarazione DOCTYPE dal vostro foglio di stile, si perderebbe nulla.
Inoltre, contra @ Tim, non v'è alcuna necessità di un DOCTYPE di dichiarare l'entità nbsp
nel codice HTML di uscita, perché è già predefiniti in HTML.
Infine, può essere diverso con @ Tim sul metodo per l'emissione di uno spazio unificatore nel codice HTML. Disable-output-fuga è quasi sempre l'approccio sbagliato, ed è dovuto ad una mancanza di comprensione di come l'analisi e il lavoro di serializzazione. Il modo più semplice per emettere un carattere di spazio non-breaking in XSLT è quello di utilizzare direttamente un'entità numerico:
<div class="headerSeparator"> </div>
Questa uscita volontà di uno spazio non-breaking.
"Ma", tu dici: "io voglio che
uscita!"
che può accadere; quando l'uscita-method = "html", la serializzazione può utilizzare le entità carattere incorporati in HTML per esprimere personaggi come questo. O la serializzazione potrebbe usare  
o semplicemente inserire direttamente un carattere non-breaking spazio. Tutti sono HTML legale, e tutti sono equivalenti. La domanda per voi, allora, è perché vuoi che serializzato come
al contrario di qualche altro equivalente?
Se ho frainteso quello che stai cercando di fare, si prega di spiegare ulteriormente, in cui si desidera che appaia
, e perché quella particolare forma questioni.
Altri suggerimenti
Questo può essere a causa della dichiarazione DOCTYPE si ha nella parte superiore della pagina. Questo potrebbe essere il nodo di testo di livello superiore l'errore si riferisce anche.
E 'la DOCTYPE qualcosa che si desidera comparire nel codice HTML che si sta creando? Se è così, probabilmente dovrebbe essere rimosso da dove è, e nel tuo primo modello, procedere come segue:
<xsl:template match="/">
<xsl:text disable-output-escaping = "yes"><![CDATA[
<!DOCTYPE some_name [ <!ENTITY nbsp " "> ]>
]]>
</xsl:text>
Poi, quando il XSLT si trasforma, il risultato sarà il seguente
<!DOCTYPE some_name [ <!ENTITY nbsp " "> ]>
<html>