Фатальная ошибка! Во время преобразования XSL

StackOverflow https://stackoverflow.com/questions/7817539

  •  26-10-2019
  •  | 
  •  

Вопрос

Я использую DITA OT для преобразования XML в XHTML. Мой XSL выглядит как

<?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>

Теперь, если я попытаюсь выполнить этот 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. Вы не пытаетесь использовать &nbsp; Сущность в таблице стиля, вы просто пытаетесь излучать один. Так что, если вы удалите заявление Doctype из своей таблицы стилей, вы ничего не потеряете.

Более того, Contra @Tim, нет необходимости в Doctype объявить nbsp сущность в выходе HTML, потому что он уже предопределен в HTML.

Наконец, я бы отличался с @TIM по методу вывода неразрывного пространства в HTML. Отключение-выпускной-это почти всегда неправильный подход, и это из-за отсутствия понимания того, как работают и сериализация. Самый простой способ вывести неразрывного пространственного символа в XSLT-напрямую использовать числовую сущность:

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

Это вызовет неразрывное пространство.

«Но, - говорите вы, - я хочу, чтобы он вышел &nbsp;!"

Это может произойти; При выходном method = "html" сериализация может использовать символы, встроенные в HTML для выражения таких символов. Или сериализация может использовать &#160; Или просто встроить неразрывного космического персонажа напрямую. Все они законны HTML, и все это эквивалентны. Для вас вопрос заключается в том, почему вы хотите, чтобы он сериализовал как &nbsp; в отличие от какого -то другого эквивалента?

Если я неправильно понял, что вы пытаетесь сделать, пожалуйста, объясните дальше, где вы хотите &nbsp; появиться и почему эта конкретная форма имеет значение.

Другие советы

Это может быть из -за объявления Doctype, которое у вас есть в верхней части страницы. Это может быть текстовый узел верхнего уровня, который ссылается на ошибку.

Является ли Doctype то, что вы хотите появиться в HTML, который вы создаете? Если это так, это, вероятно, следует удалить с того места, где он находится, и в вашем первом шаблоне сделайте следующее:

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

Затем, когда XSLT преобразован, он выведет следующее

<!DOCTYPE some_name [  <!ENTITY nbsp "&#160;">  ]> 
<html>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top