30

XSL FO を使用して、情報を含むテーブルを含む PDF ファイルを生成しています。これらの列の 1 つが「説明」列です。これらの [説明] フィールドの 1 つに入力する文字列の例は次のとおりです。

This is an example Description.<br/>List item 1<br/>List item 2<br/>List item 3<br/>List item 4

この説明に対応する表のセル内に、出力を次のように表示したいと思います。

This is an example Description.
List item 1
List item 2
List item 3
List item 4

<fo:block></fo:block>他の場所を検索して、XSL FOで別の<fo:block>要素内を使用して改行できることを知りました。したがって、XML を XSL スタイルシートで解析する前であっても、出現するすべての を に置き換えて<br/><fo:block/>文字列のリテラル値が次のようになるようにします。

This is an example Description.<fo:block/>List item 1<fo:block/>List item 2<fo:block/>List item 3<fo:block/>List item 4

<xsl:value-of>私が使用している説明文字列が次の例を使用して取得されると、問題が発生します。

<fo:block>
    <xsl:value-of select="descriptionStr"/>
</fo:block>

この場合、私の PDF ドキュメントに出力される値はリテラル値であるため、すべてのリテラルを含む前の例とまったく同じように見え<fo:block/>ます。<fo:block/>別の文字列の途中で手動でハードコーディングしてみましたが、正しく表示されます。たとえば、スタイルシート内に次のように記述した場合:

<fo:block>Te<fo:block/>st</fo:block>

次のように正しく表示されます。

Te
st

しかし、ステートメント<fo:block/>の値の中にある場合、これは起こらないようです。<xsl:value-of select=""/>SOやGoogleなどでこれを検索しようとしましたが、役に立ちませんでした。アドバイスやヘルプをいただければ幸いです。ありがとうございました!

4

11 に答える 11

46

に置き換え<br/>て属性を&#xA;追加することもできます。linefeed-treatment="preserve"<fo:block>

何かのようなもの:

<fo:block linefeed-treatment="preserve">This is an example Description.&#xA;List item 1&#xA;List item 2&#xA;List item 3&#xA;List item 4</fo:block>

編集

一部のユーザーは、XML の作成方法に応じて\n代わりに使用する必要がある場合があります。 を保持する&#xA;を参照してください。詳細については、xml マーシャリング中に。

于 2010-09-08T03:32:43.350 に答える
11

これは私を助け、最も簡単な解決策になるはずです(Apache FOP 1.1での作業):

行セパレーター<br/>と呼ばれる Unicode 文字に置き換えてみませんか。

   <xsl:template match="br">
      <xsl:value-of select="'&#x2028;'"/>
   </xsl:template>

https://en.wikipedia.org/wiki/Newline#Unicodeを参照

于 2015-12-15T12:14:36.997 に答える
5

xsl:value-of命令を使用するべきではありませんが、xsl:apply-templates代わりに: テキスト ノードの組み込みルールは文字列値を出力するだけであり、空の要素の場合は、ルールに一致するor (入力に応じて) をbr宣言して、 empty に変換することができます。descriptionStr/brdescriptionStr//brfo:block

于 2010-09-07T19:22:32.507 に答える
3

エスケープされた XML マークアップを含む文字列を生成することが正しい答えになることはめったにありませんが、それを使用する必要がある場合は、次のような入力を行います。

<Description><![CDATA[This is an example Description.<br/>List item 1<br/>List item 2<br/>List item 3<br/>List item 4]]></Description>

XSLT 2.0 を使用している場合は、最初に必要だっxsl:analyze-stringた空を取得するために使用できます。fo:block

<xsl:template match="Description">
  <fo:block>
    <xsl:analyze-string select="." regex="&lt;br/>">
      <xsl:matching-substring>
        <fo:block />
      </xsl:matching-substring>
      <xsl:non-matching-substring>
        <xsl:value-of select="." />
      </xsl:non-matching-substring>
    </xsl:analyze-string>
  </fo:block>
</xsl:template>

ただし、XSLT 2.0 を使用している場合は、linefeed-treatment="preserve"@Daniel Haley に従ってより簡潔に使用しreplace()、改行を挿入するために使用できます。

<xsl:template match="Description">
  <fo:block linefeed-treatment="preserve">
    <xsl:value-of select="replace(., '&lt;br/>', '&#xA;')" />
  </fo:block>
</xsl:template>

XSLT 1.0 を使用している場合は、文字列を再帰的に処理できます。

<xsl:template match="Description">
  <fo:block linefeed-treatment="preserve">
    <xsl:call-template name="replace-br" />
  </fo:block>
</xsl:template>

<xsl:template name="replace-br">
  <xsl:param name="text" select="." />

  <xsl:choose>
    <xsl:when test="not(contains($text, '&lt;br/>'))">
      <xsl:value-of select="$text" />
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="substring-before($text, '&lt;br/>')"/>
      <xsl:text>&#xA;</xsl:text> <!-- or <fo:block /> -->
      <xsl:call-template name="replace-br">
        <xsl:with-param name="text" select="substring-after($text, '&lt;br/>')"/>
      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
于 2016-08-13T14:54:28.123 に答える
1

これを試して:

<fo:block><fo:inline color="transparent">x</fo:inline></fo:block>

このコードは、透明なテキストを含むブロックを追加して、改行のように見せます。

于 2013-08-29T09:23:20.510 に答える
-2

</fo:block><br/> <br/>それ自体は、xsl:fo に直接の同等物がない html の対になっていない例外であるの直接の代替物ではありません。

</fo:block> ブロックの終わりを意味します。それらをテキストに分散させると、有効な xml が得られず、xsl プロセッサでエラーが発生します。

必要な改行フォーマットでは、各ブロックが新しい行に発生します。行ごとに<fo:block>開始ブロックと終了ブロックのペアが必要です。</fo:block>

于 2012-04-03T21:52:00.050 に答える