2

改行で区切られた XML ドキュメントのテキストを出力できる必要があります。つまり、XML:

<programlisting>
public static void main(String[] args){
    System.out.println("Be happy!");  
    System.out.println("And now we add annotations.");  
}
</programlisting>

次のように表す必要があります。

<para>public static void main(String[] args){</para>
<para>    System.out.println("Be happy!"); </para>
<para>    System.out.println("And now we add annotations.");  </para>
<para>}</para>

substring-before(., '\n') が使えるはずだと思っていたのですが、なぜか改行が認識されません。

また、各行を CDATA セクションとして出力して、それらを個別に取得できるようにしようとしましたが、それらがすべて 1 つのテキスト ノードにまとめられているという事実に遭遇しました。

ここでは、変換のために通常の Java を使用しています。これを達成する方法についてのアイデアはありますか?

ありがとう...

4

2 に答える 2

2

この回答で説明したように、XML のすべての改行はエンティティのように扱われます&#10;。つまり、文字列を改行で分割するには、このエンティティで分割する必要があります。

したがって、プレーンな XSLT 1.0 (拡張なし) でのソリューションは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
  <xsl:output indent="yes"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="programlisting/text()">
    <xsl:param name="text" select="."/>
    <para>
      <!-- Because we would rely on $text containing a line break when using 
           substring-before($text,'&#10;') and the last line might not have a
           trailing line break, we append one before doing substring-before().  -->
      <xsl:value-of select="substring-before(concat($text,'&#10;'),'&#10;')"/>
    </para>
    <xsl:if test="contains($text,'&#10;')">
      <xsl:apply-templates select=".">
        <xsl:with-param name="text" select="substring-after($text,'&#10;')"/>
      </xsl:apply-templates>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

指定された XML ソースを使用する<para>と、最初と最後の改行でいくつかの空の要素が出力されます。空行をチェックすることもできます (Dimitre のように)。ただし、これにより、コード リストの途中にある空の行も削除されます。途中の空行を保持しながら、最初と最後の空行を削除することが重要である場合は、より巧妙なアプローチが必要になります。

これは、単純な XSLT 1.0 を使用したタスクがまったく難しくないことを示しているだけです。

于 2012-12-30T20:13:09.637 に答える