Frage

Ich verwende Dita OT, um das XML in XHTML umzuwandeln. Mein XSL sieht aus wie

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE some_name [ 
<!ENTITY nbsp "&#160;"> 
]>
<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">&amp;nbsp;</xsl:text>
 </div>
 </xsl:template>

 </xsl:stylesheet>

Wenn ich jetzt versucht habe, diese XSL gegen meine XML für die XHTML -Transformation mit Dita ot Jar CMD auszuführen.

java -jar .\lib\dost.jar /i:samples/mycompany/myContent/myContent.ditamap /transtype:xhtml /xsl:xsl/mycompany/custom-map2xhtml.xsl

Nachdem ich den obigen Befehl ausgeführt habe, erhalte ich den folgenden Fehler.

[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

Ich breche mir den Kopf, um herauszufinden, warum dieser Fehler auftritt.

Vielen Dank.

War es hilfreich?

Lösung

this document contains a top-level text node

Können Sie uns das Ende des XSLT Stylesheet zeigen? Gibt es einen Text nach dem Finale? </xsl:stylesheet>? Das würde diesen Fehler verursachen.

Aktualisieren

Wie Dimitre betonte, die <xsl:template> Start/End -Tags sind unausgeglichen. Wenn Sie also nur einen Teil Ihres XSLT anzeigen, muss dies behoben werden.

Ich stimme jedoch @tim C zu, dass Sie in Ihrem XSLT wahrscheinlich überhaupt keine DocType -Erklärung wollen. Sie versuchen nicht, die zu verwenden &nbsp; Entität im Stylesheet, Sie versuchen nur, einen auszugeben. Wenn Sie also die Anweisung docType aus Ihrem Stylesheet entfernt würden, würden Sie nichts verlieren.

Darüber hinaus besteht keine Notwendigkeit, dass ein DocType das erklärt, das zu deklarieren nbsp Entität im Ausgang HTML, da es bereits in HTML vordefiniert ist.

Schließlich würde ich mich mit @tim in der Methode unterscheiden, um einen nicht bahnbrechenden Raum in der HTML auszugeben. Deaktivieren Sie die Ausgabe des Aussagens ist fast immer der falsche Ansatz und ist auf ein Mangel an Verständnis dafür zurückzuführen, wie Parsing- und Serialisierungs funktioniert. Der einfachste Weg, einen nicht brechensspace-Zeichen in XSLT auszugeben, besteht darin, eine numerische Entität direkt zu verwenden:

<div class="headerSeparator">&#160;</div>

Dies gibt einen nicht bahnbrechenden Raum aus.

"Aber", sagst du, "ich möchte, dass es ausgibt &nbsp;!"

Das kann passieren; Bei Ausgabe-Method = "HTML" kann die Serialisierung die in HTML eingebauten Zeicheneinheiten verwenden, um solche Zeichen auszudrücken. Oder die Serialisierung könnte gebrauchen &#160; oder einfach einen nicht bahnbrechenden Raumcharakter direkt einbetten. Alle sind legal HTML und alle sind gleichwertig. Die Frage an Sie ist also, warum Sie es serialisiert haben möchten &nbsp; im Gegensatz zu einem anderen Äquivalent?

Wenn ich falsch verstanden habe, was Sie versuchen zu tun, erklären Sie bitte weiter, wo Sie wollen &nbsp; erscheinen und warum diese bestimmte Form wichtig ist.

Andere Tipps

Dies kann an der DocType -Erklärung liegen, die Sie oben auf der Seite haben. Dies könnte der Textknoten der obersten Ebene sein, der sich auch auf den Fehler bezieht.

Ist der docType etwas, das Sie in der HTML erscheinen möchten, die Sie erstellen? Wenn ja, sollte es wahrscheinlich von dort entfernt werden und in Ihrer ersten Vorlage Folgendes tun:

<xsl:template match="/">
   <xsl:text disable-output-escaping = "yes"><![CDATA[
      <!DOCTYPE some_name [  <!ENTITY nbsp "&#160;">  ]> 
   ]]>
   </xsl:text>

Wenn dann der XSLT transformiert wird, wird die folgende Ausgabe ausgegeben

<!DOCTYPE some_name [  <!ENTITY nbsp "&#160;">  ]> 
<html>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top