我正在使用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>
现在如果我尝试使用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
我突然发现这个错误发生的原因。
感谢。
答案 0 :(得分:2)
this document contains a top-level text node
您能告诉我们XSLT样式表的结尾吗?最终</xsl:stylesheet>
之后是否有一些文字?这会导致此错误。
正如Dimitre指出的那样,<xsl:template>
开始/结束标记是不平衡的,所以除非你只显示部分XSLT,否则必须修复它。
但是,我同意@Tim C,你可能根本不想在你的XSLT中使用DOCTYPE声明。你不是试图在样式表中使用
实体,而只是尝试发出一个。{1}}实体。因此,如果从样式表中删除了DOCTYPE语句,则不会丢失任何内容。
此外,对于@Tim,不需要DOCTYPE在输出HTML中声明nbsp
实体,因为它已经在HTML中预定义了。
最后,对于在HTML中输出不间断空格的方法,我会与@Tim不同。禁用 - 输出 - 转义几乎总是错误的方法,并且由于缺乏对解析和序列化如何工作的理解。在XSLT中输出不间断空格字符的最简单方法是直接使用数字实体:
<div class="headerSeparator"> </div>
这将输出一个不间断的空间。
“但是,”你说,“我希望它输出
!”
可能会发生;当output-method =“html”时,序列化可以使用HTML内置的字符实体来表达这样的字符。或者序列化可以使用 
或直接嵌入不间断的空格字符。所有都是合法的HTML,都是等价的。那么,问题是,为什么你希望它被序列化为
而不是其他等价物呢?
如果我误解了你想要做的事情,请进一步解释,你想要
出现在哪里,以及为什么这个特定形式很重要。
答案 1 :(得分:0)
这可能是因为您在页面顶部有DOCTYPE声明。这可能是错误所指的顶级文本节点。
您希望在正在创建的html中显示DOCTYPE吗?如果是这样,它应该从它的位置删除,并在第一个模板中执行以下操作:
<xsl:template match="/">
<xsl:text disable-output-escaping = "yes"><![CDATA[
<!DOCTYPE some_name [ <!ENTITY nbsp " "> ]>
]]>
</xsl:text>
然后,当转换XSLT时,它将输出以下
<!DOCTYPE some_name [ <!ENTITY nbsp " "> ]>
<html>