Фатальная ошибка! Во время преобразования XSL
Вопрос
Я использую DITA OT для преобразования XML в XHTML. Мой XSL выглядит как
<?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>
Теперь, если я попытаюсь выполнить этот XSL против моего XML для преобразования XHTML, используя DITA OT JAR CMD.
java -jar .\lib\dost.jar /i:samples/mycompany/myContent/myContent.ditamap /transtype:xhtml /xsl:xsl/mycompany/custom-map2xhtml.xsl
После выполнения вышеупомянутой команды я получаю следующую ошибку.
[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
Я сломаю голову, чтобы узнать, почему возникает эта ошибка.
Спасибо.
Решение
this document contains a top-level text node
Можете ли вы показать нам конец таблицы стилей XSLT? Есть ли текст после финала </xsl:stylesheet>
? Это вызвало бы эту ошибку.
Обновлять
Как указал Димитр, <xsl:template>
Начальные/конечные теги не сбалансированы, поэтому, если вы не показываете только часть своего XSLT, это должно быть исправлено.
Тем не менее, я согласен с @TIM C, что вы, вероятно, не хотите объявлять Doctype вообще в вашем XSLT. Вы не пытаетесь использовать
Сущность в таблице стиля, вы просто пытаетесь излучать один. Так что, если вы удалите заявление Doctype из своей таблицы стилей, вы ничего не потеряете.
Более того, Contra @Tim, нет необходимости в Doctype объявить nbsp
сущность в выходе HTML, потому что он уже предопределен в HTML.
Наконец, я бы отличался с @TIM по методу вывода неразрывного пространства в HTML. Отключение-выпускной-это почти всегда неправильный подход, и это из-за отсутствия понимания того, как работают и сериализация. Самый простой способ вывести неразрывного пространственного символа в XSLT-напрямую использовать числовую сущность:
<div class="headerSeparator"> </div>
Это вызовет неразрывное пространство.
«Но, - говорите вы, - я хочу, чтобы он вышел
!"
Это может произойти; При выходном method = "html" сериализация может использовать символы, встроенные в HTML для выражения таких символов. Или сериализация может использовать  
Или просто встроить неразрывного космического персонажа напрямую. Все они законны HTML, и все это эквивалентны. Для вас вопрос заключается в том, почему вы хотите, чтобы он сериализовал как
в отличие от какого -то другого эквивалента?
Если я неправильно понял, что вы пытаетесь сделать, пожалуйста, объясните дальше, где вы хотите
появиться и почему эта конкретная форма имеет значение.
Другие советы
Это может быть из -за объявления Doctype, которое у вас есть в верхней части страницы. Это может быть текстовый узел верхнего уровня, который ссылается на ошибку.
Является ли Doctype то, что вы хотите появиться в HTML, который вы создаете? Если это так, это, вероятно, следует удалить с того места, где он находится, и в вашем первом шаблоне сделайте следующее:
<xsl:template match="/">
<xsl:text disable-output-escaping = "yes"><![CDATA[
<!DOCTYPE some_name [ <!ENTITY nbsp " "> ]>
]]>
</xsl:text>
Затем, когда XSLT преобразован, он выведет следующее
<!DOCTYPE some_name [ <!ENTITY nbsp " "> ]>
<html>