0

我正在使用 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>

现在,如果我尝试使用 DITA OT jar cmd 对我的 xml 执行此 xsl 以进行 xhtml 转换。

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

我打破了我的头,找出为什么会发生这个错误。

谢谢。

4

2 回答 2

3
this document contains a top-level text node

你能告诉我们 XSLT 样式表的结尾吗?决赛后有文字</xsl:stylesheet>吗?那会导致这个错误。

更新

正如 Dimitre 所指出的,<xsl:template>开始/结束标签是不平衡的,因此除非您只显示 XSLT 的一部分,否则必须修复它。

但是,我同意@Tim C 的观点,即您可能根本不希望在 XSLT 中使用 DOCTYPE 声明。您没有尝试使用&nbsp;样式表中的实体,您只是想发出一个。因此,如果您从样式表中删除 DOCTYPE 语句,您将不会丢失任何内容。

此外,与@Tim 相反,不需要 DOCTYPEnbsp在输出 HTML 中声明实体,因为它已经在 HTML 中预定义。

最后,在 HTML 中输出不间断空格的方法上,我会与 @Tim 有所不同。禁用输出转义几乎总是错误的方法,并且是由于对解析和序列化的工作方式缺乏了解。在 XSLT 中输出不间断空格字符的最简单方法是直接使用数字实体:

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

这将输出一个不间断的空格。

“但是,”你说,“我希望它输出&nbsp;!”

这可能会发生;当 output-method="html" 时,序列化可以使用 HTML 内置的字符实体来表达这样的字符。或者序列化可以直接使用&#160;或简单地嵌入不间断的空格字符。所有都是合法的 HTML,并且都是等价的。那么,您的问题是,为什么要序列化它&nbsp;而不是其他等价物?

如果我误解了您要执行的操作,请进一步解释您想要&nbsp;出现的位置以及该特定形式为何重要。

于 2011-10-19T07:09:51.773 回答
0

这可能是因为您在页面顶部的 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>
于 2011-10-19T11:32:19.877 回答