XML をプレーンテキストに変換する - XSLT 内の空白をどのように無視/処理すればよいですか? 質問する

XML をプレーンテキストに変換する - XSLT 内の空白をどのように無視/処理すればよいですか? 質問する

私は、XSLT を使用して、XML ファイルを dokuwiki で使用されるマークアップに変換しようとしています。これは実際にはある程度機能しますが、XSL ファイルのインデントが結果に挿入されます。現時点では、2 つの選択肢があります。この XSLT を完全に放棄し、XML から dokuwiki マークアップに変換する別の方法を見つけるか、XSL ファイルから空白の約 95% を削除して、ほとんど読みにくくし、メンテナンスの悪夢にするかです。

最終ドキュメントにすべての空白を渡さずに、XSL ファイル内のインデントを維持する方法はありますか?

背景: 私は、静的 HTML ページから dokuwiki に autodoc ツールを移行しています。これにより、アプリケーション チームがドキュメント化が不十分なコードに遭遇したときに、サーバー チームが開発した API をアプリケーション チームがさらにドキュメント化できるようになります。ロジックは、各ページのセクションを autodoc ツール用に確保し、このブロックの外側の任意の場所にコメントを許可することです。XML から XHTML に変換するための XSL ファイルが既にあるため、XSLT を使用しています。また、独自のソリューションを最初から作成するよりも、XSL を書き直す方が速いと考えています。

編集: ああ、そう、私は愚かでした。インデント属性を無視していました。(その他の背景メモ: 私は XSLT 初心者です。) 一方、改行を処理する必要があります。Dokuwiki はパイプを使用してテーブル列を区別します。つまり、テーブル行のすべてのデータは 1 行に収まっている必要があります。改行の出力を抑制する方法 (たまに) はありますか。そうすれば、各テーブル セルに対して、ある程度読みやすい方法でかなり複雑なロジックを実行できます。

ベストアンサー1

XSLT 変換の結果に不要な空白が含まれる理由は 3 つあります。

  1. ソース文書内のノード間の空白
  2. ソース文書内のノード内から発生する空白
  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<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

しかしいくつかの<xsl:value-of>XSLT スタイルシート内の空白、つまりノード間の空白は自動的に削除されます。と の終わりの間に改行があるため、結果に改行は表示されません<xsl:template>

結果に必要なテキストのみを取得するには、<xsl:text>次のように要素を使用します。

<xsl:template match="name">
  <xsl:text>Name: </xsl:text>
  <xsl:value-of select="." />
</xsl:template>

XSLT プロセッサは、ノード間に表示される改行とインデントを無視し、<xsl:text>要素内のテキストのみを出力します。

おすすめ記事