XSLT 変換の結果に不要な空白が含まれる理由は 3 つあります。
- ソース文書のノード間から来る空白
- ソース ドキュメントのノード内にある空白
- スタイルシートからの空白
空白がどこから来ているのかを判断するのは難しいため、3 つすべてについて説明します。そのため、いくつかの戦略を使用する必要があるかもしれません。
ソース ドキュメントのノード間の空白に対処するには、 を使用<xsl:strip-space>
して 2 つのノード間に表示される空白を取り除き、 を使用<xsl:preserve-space>
して混合コンテンツ内に表示される可能性のある重要な空白を保持する必要があります。たとえば、ソース ドキュメントが次のようになっているとします。
<ul>
<li>This is an <strong>important</strong> <em>point</em></li>
</ul>
その場合、重要ではないとと の間の<ul>
と の間の空白を無視する必要がありますが、重要な 要素と要素の間の空白を保持します(そうしないと、「これは**重要** です。 *点*")。これを行うには<li>
</li>
</ul>
<strong>
<em>
<xsl:strip-space elements="*" />
<xsl:preserve-space elements="li" />
elements
on 属性は基本的に、<xsl:preserve-space>
混合コンテンツを持つ文書内のすべての要素をリストする必要があります。
余談ですが、 を使用<xsl:strip-space>
すると、メモリ内のソース ツリーのサイズも縮小され、スタイルシートがより効率的になるため、この種の空白の問題がなくても実行する価値があります。
ソース ドキュメントのノード内に表示される空白に対処するには、 を使用する必要がありますnormalize-space()
。たとえば、次の場合:
<dt>
a definition
</dt>
そして、<dt>
要素が何かをしたい要素を保持していないことを確認できます。次に、次のことができます。
<xsl:template match="dt">
...
<xsl:value-of select="normalize-space(.)" />
...
</xsl:template>
先頭と末尾の空白は<dt>
要素の値から取り除かれ、文字列が取得されます"a definition"
。
おそらくあなたが経験しているものであるスタイルシートからの空白に対処するには、次のようなテンプレート内にテキストがある場合です。
<xsl:template match="name">
Name:
<xsl:value-of select="." />
</xsl:template>
XSLT スタイルシートは、処理するソース ドキュメントと同じ方法で解析されるため、上記の XSLT は、最初の子がテキスト ノードで、2 番目の子が属性を持つ要素である属性を持つ要素<xsl:template>
を保持するツリーとして解釈されます。テキスト ノードには、先頭と末尾の空白 (改行を含む) があります。これはスタイルシートのリテラル テキストであるため、先頭と末尾のすべての空白とともに、文字どおり結果にコピーされます。match
<xsl:value-of>
select
ただし、XSLT スタイルシートの一部の空白、つまりノード間の空白は自動的に削除されます。<xsl:value-of>
と の終わりの間に改行があるため、結果に改行はありません<xsl:template>
。
結果に必要なテキストのみを取得するには、次の<xsl:text>
ように要素を使用します。
<xsl:template match="name">
<xsl:text>Name: </xsl:text>
<xsl:value-of select="." />
</xsl:template>
XSLT プロセッサは、ノード間に表示される改行とインデントを無視し、<xsl:text>
要素内のテキストのみを出力します。