回答:
これを行うための私の好まれる方法は次のようになります。
<xsl:stylesheet>
<xsl:output method='text'/>
<xsl:variable name='newline'><xsl:text>
</xsl:text></xsl:variable>
<!-- note that the layout there is deliberate -->
...
</xsl:stylesheet>
次に、改行(おそらくcsvの場合)を出力するときはいつでも、次のような出力を行うことができます。
<xsl:value-of select="concat(elem1,elem2,elem3,$newline)" />
xml入力からsqlを出力するときにこのテクニックを使用しました。実際、コンマ、引用符、改行の変数を作成する傾向があります。
xml:space="preserve"
ためにxsl:text
要素に宣言を追加する価値がありますが、@ Florjonの答えがおそらくより安全であることには同意します。
属性Method = "text"をxsl:outputタグに含め、改行をXSLのリテラルコンテンツの適切なポイントに含めます。XSLのソースコードを整頓し
たい場合は、改行したいエンティティを使用してください。
以下を使用できます。 <xsl:text> </xsl:text>
例を見る
<xsl:variable name="module-info">
<xsl:value-of select="@name" /> = <xsl:value-of select="@rev" />
<xsl:text> </xsl:text>
</xsl:variable>
これをファイルに書き込むと、たとえば
<redirect:write file="temp.prop" append="true">
<xsl:value-of select="$module-info" />
</redirect:write>
この変数は、次のように新しいファイルinfileを生成します。
commons-dbcp_commons-dbcp = 1.2.2
junit_junit = 4.4
org.easymock_easymock = 2.4
私見@Florjonが提供した以上の情報は必要ありません。たぶんそれが時々私たちにとってうまくいかないかもしれない理由を理解するためにいくつかの小さな詳細が残っているかもしれません。
まず、a内の

(hex)または

(dec)<xsl:text/>
は常に機能しますが、表示されない場合があります。
<br/>
を使用するとうまくいきます。それ以外の場合は、空白が表示されます。ブラウザからソースを表示すると、実際に何が起こったかがわかります。ただし、特に消費者が直接ブラウザでない場合は、この動作を期待する場合があります。たとえば、HTMLページを作成して、ブラウザに提供する前に、空の行とIDで適切にフォーマットされた構造を表示するとします。disable-output-escaping
。別のXMLを作成し、そのDTDをスタイルシートから宣言する必要がある次の例を見てみましょう。最初のバージョンは文字をエスケープします(xsl:textのデフォルト)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:template match="/">
<xsl:text><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


</xsl:text>
<xsl:copy>
<xsl:apply-templates select="*" mode="copy"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()" mode="copy">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="copy"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
そしてここに結果があります:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">
<Subscriptions>
<User id="1"/>
</Subscriptions>
OK、それは私たちが期待することを行い、エスケープは使用した文字が適切に表示されるように行われます。ルートノード内のXML部分のフォーマットは、によって処理されident="yes"
ます。しかし、よく見ると、改行文字

がそのままエスケープおよび変換されておらず、二重改行が実行されていることがわかります。これについての説明はありませんが、知っておくと良いでしょう。誰でも?
2番目のバージョンは文字をエスケープしないため、意図したとおりの文字を生成しています。行われた変更は次のとおりです。
<xsl:text disable-output-escaping="yes"><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


</xsl:text>
そしてここに結果があります:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">
<Subscriptions>
<User id="1"/>
</Subscriptions>
そしてそれは大丈夫でしょう。crとlfの両方が適切にレンダリングされます。
nl
ではなく、について話していることを忘れないでください。私の最初の試みはcr:のみを使用することでしたが、出力xmlはDOMによって適切に検証されました。crlf
nl=lf

破損したxmlを表示していた:
<?xml version="1.0" encoding="utf-8"?>
<Subscriptions>riptions SYSTEM "Subscriptions.dtd">
<User id="1"/>
</Subscriptions>
DOMパーサーは制御文字を無視しましたが、レンダリングされませんでした。頭がおかしくなるのにかなり時間がかかりました。
記録のために、私は両方のCRLFで本体内の変数を使用しています。
DOCTYPE
ここに表示されるディレクティブを追加しました:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY nl "
">
]>
<xsl:stylesheet xmlns:x="http://www.w3.org/2005/02/query-test-XQTSCatalog"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
これにより、出力に改行を生成する&nl;
代わりにを使用でき

ます。他のソリューションと同様に、これは通常<xsl:text>
タグ内に配置されます。
私はニックギブソンの方法の2番目です。これは常に私のお気に入りでした。
<xsl:variable name='nl'><xsl:text>
</xsl:text></xsl:variable>
ただし、Antタスク<echoxml>を使用してスタイルシートを作成し、ファイルに対して実行しています。タスクは$ {DSTAMP}などの属性値テンプレートを実行しますが、XMLを再フォーマットするため、場合によってはエンティティ参照が適しています。
<xsl:variable name='nl'><xsl:text>
</xsl:text></xsl:variable>
select
代わりに使用することをお勧めしますxsl:text
。例:<xsl:variable name="nl" select="'
'"/>
このようにして、不要なRTF(結果ツリーフラグメント)を作成しません。
私は、新しいライン生産というのが私の経験から気づいたINSIDE<xsl:variable>
句は仕事をしません。私は次のようなことをやろうとしました:
<xsl:variable name="myVar">
<xsl:choose>
<xsl:when test="@myValue != ''">
<xsl:text>My value: </xsl:text>
<xsl:value-of select="@myValue" />
<xsl:text></xsl:text> <!--NEW LINE-->
<xsl:text>My other value: </xsl:text>
<xsl:value-of select="@myOtherValue" />
</xsl:when>
</xsl:choose>
<xsl:variable>
<div>
<xsl:value-of select="$myVar"/>
</div>
その「新しい行」(空の<xsl:text>
ノード)に入れようとしたことは、(このページの簡単な提案のほとんどを含めて)機能せず、HTMLがそこで機能しないという事実は言うまでもありません。それを2つの変数に分割し、<xsl:variable>
スコープの外でそれらを呼び出して、それらの<br/>
間にシンプルを置く必要がありました:
<xsl:variable name="myVar1">
<xsl:choose>
<xsl:when test="@myValue != ''">
<xsl:text>My value: </xsl:text>
<xsl:value-of select="@myValue" />
</xsl:when>
</xsl:choose>
<xsl:variable>
<xsl:variable name="myVar2">
<xsl:choose>
<xsl:when test="@myValue != ''">
<xsl:text>My other value: </xsl:text>
<xsl:value-of select="@myOtherValue" />
</xsl:when>
</xsl:choose>
<xsl:variable>
<div>
<xsl:value-of select="$myVar1"/>
<br/>
<xsl:value-of select="$myVar2"/>
</div>
ええ、私は知っています。これは最も洗練されたソリューションではありませんが、私の欲求不満の経験をXSLと共有するだけで機能します;)
<xsl:text>
</xsl:text>
XSLTを使用してXMLファイルをフォーマットするとエンティティが表示されなくなるため、この方法を使用できませんでした。だから私は変数を使用するアプローチをもう少しラウンドする必要がありました
<xsl:variable name="nl" select="' '"/>
<xsl:template match="/">
<xsl:value-of select="$nl" disable-output-escaping="no"/>
<xsl:apply-templates select="*"/>
</xsl:template>