次の方法で共有


<xsl:preserve-space> 要素

elements 属性で指定されている要素内に出現する可能性がある空白のみのテキスト ノードを保持します。

<xsl:preserve-space
  elements = tokens />

属性

  • elements
    これは必ず指定する必要がある属性です。値は、保持する必要のある空白のみのテキスト ノードが含まれたノードの名前トークンを空白で区切ったリストです。

要素情報

出現回数

無制限

親要素

xsl:stylesheetxsl:transform

子要素

(子要素はありません)

解説

<xsl:preserve-space> 要素は、指定された要素内の空白のみのテキスト ノードを保持します。この要素は、空白文字と非空白文字の両方が含まれたテキスト ノード内の空白文字に対しては無効です。ここでいう「空白のみのテキスト ノードの保持」とは、ソース ドキュメントのノードが、結果として生成されるドキュメント内で保持されるという意味です。<xsl:strip-space> は、その逆を行います。つまり、指定されたノード内の空白のみのテキスト ノードを除去します。

既定では、すべての空白のみのテキスト ノードが保持されます。要素名が <xsl:strip-space> 要素の名前テストと一致する場合、その要素名は、空白保持要素名のセットから除去されます。要素名が <xsl:preserve-space> 要素の名前テストと一致する場合、その要素名は、空白保持要素名のセットに戻されます。

詳細については、www.w3.org/TR/xslt で、『XSLT W3C Recommendation』のセクション 3.4「Whitespace Stripping」を参照してください。

次の例では、<xsl:preserve-space><xsl:strip-space> を使用して、空白のみのテキスト ノードを保持または削除する操作の効果を示します。

XML ファイル (source.xml)

<?xml version="1.0"?>
<document>
<text>   </text>
<text>  ;</text>
<text>
This is a   sample text 
    
</text>
<code>   </code>
<code>  ;</code>
<code>
This is a   sample code 
    
</code>
</document>

XSLT ファイル (trans.xsl)

<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <!-- 
     The following xsl:preserve-space is not necessary.
     It is included to emphasize the fact that white-space-only
     text nodes are to be preserved on the <code> elements.
   -->
  <xsl:preserve-space elements="code"/>
  <xsl:strip-space elements="text"/>

  <xsl:template match="/">
    code elements:
    <xsl:apply-templates select="//code"/>

    text elements:
    <xsl:apply-templates select="//text"/>
  </xsl:template>

  <xsl:template match="text">
     text # <xsl:value-of select="position()"/>
     has <xsl:value-of select="count(text())"/> text(). 
     "<xsl:value-of select="translate(.,' &#10;&#13;&#9;', '-NRT')"/>"
  </xsl:template>
  

  <xsl:template match="code">
     code # <xsl:value-of select="position()"/>
     has <xsl:value-of select="count(text())"/> text(). 
     "<xsl:value-of select="translate(.,' &#10;&#13;&#9;', '-NRT')"/>"
  </xsl:template>

</xsl:stylesheet>

手順を次に示します。

  1. 上記のコード サンプルをコピーして、ローカル ドライブ上の適切なファイルに保存します。

  2. 次に示すように、コマンド プロンプトでコマンド ライン変換ユーティリティ (msxsl.exe) を使用し、XSLT 変換を起動します。

    msxsl source.xml trans.xsl

    重要

    Internet Explorer から変換を起動しないでください。Internet エクスプローラでは一種の空白削除処理が実行されますが、この処理は XSLT の仕様と互換性がありません。これにより、XLST 変換で異常な動作が生じる可能性があります。

出力

これは標準出力です。

code elements:

code # 1

has 1 text().

"---"

code # 2

has 1 text().

"--;"

code # 3

has 1 text().

"NThis-is-a-Tsample-codeTNTN"

text elements:

text # 1

has 0 text().

""

text # 2

has 1 text().

"--;"

text # 3

has 1 text().

"NThis-is-a-Tsample-textTNTN"

変換では、最初の <code> 要素に対して 1 つのテキスト ノードのみが出力されますが、最初の <text> 要素に対してはテキスト ノードが出力されないことに注意してください。その理由は、これら 2 つの要素はどちらも空白のみのテキスト ノードを含んでいますが、スタイル シートの冒頭に記述されている <xsl:preserve-space> 命令と <xsl:strip-space> 命令に従って、<code> では空白が保持され、<text> では空白が削除されるためです。各種類の要素の 2 番目および 3 番目の要素からは、空白のみではないテキスト ノードがこのような命令の影響を受けないことがわかります。

参照

リファレンス

<xsl:strip-space> 要素