Фатальная ошибка! Во время XSL-преобразования - PullRequest
0 голосов
/ 19 октября 2011

Я использую 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

Я ломаю голову, чтобы выяснить причину этой ошибки.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 19 октября 2011
this document contains a top-level text node

Можете ли вы показать нам конец таблицы стилей XSLT?Есть ли какой-нибудь текст после финала </xsl:stylesheet>?Это может привести к этой ошибке.

Обновление

Как указал Димитр, начальные / конечные теги <xsl:template> несбалансированы, поэтому, если вы не показываете только часть вашего XSLT, это должнобыть исправленным.

Однако я согласен с @Tim C, что вы, вероятно, вообще не хотите, чтобы объявление DOCTYPE в вашем XSLT.Вы не пытаетесь использовать сущность &nbsp; в таблице стилей, вы просто пытаетесь ее воспроизвести.Поэтому, если вы удалите оператор DOCTYPE из таблицы стилей, вы ничего не потеряете.

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

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

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

Это выведет неразрывный пробел.

«Но, выговорят: «Я хочу, чтобы он вывел &nbsp;

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

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

0 голосов
/ 19 октября 2011

Это может быть из-за объявления 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>
...