0

XMLをxhtmlに変換するためにDITAOTを使用しています。私の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を使用して、xhtml変換用のxmlに対してこのxslを実行しようとした場合。

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とは対照的に、DOCTYPEはnbsp既にHTMLで事前定義されているため、出力HTMLでエンティティを宣言する必要はありません。

最後に、HTMLでノーブレークスペースを出力する方法については、@Timとは異なります。Disable-output-escapingは、ほとんどの場合間違ったアプローチであり、解析とシリアル化がどのように機能するかについての理解が不足しているためです。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 に答える