2016-06-21 22 views
1

これは私の問題です。私は多くの場所で使用される変換文書を持っており、小さな書式変換の多くを一般的に扱います。ある特定のケースでは、結果から空白を削除する必要があります。XSLT:ノードを保存している余分な空白文字を削除

「\ nは                  < I>サムシング</I>上付きノートでは非常に重要な< SUP> 1 </SUP> \ nは       :出力は次のようになります

:   「

私は上のバリエーションを試してみました

ただし、出力からサブノードが削除されます。私は変換の一般的な処理を妨げるので、 'text()'のような普遍的なテンプレートを設定しないように非常に注意する必要があります。私はここで何かを見逃しているようです。

EDIT:Stefan-Hegnyの示唆通りに恒等変換を試しました。

<xsl:template match="title_full"> 
    <xsl:apply-templates mode="stripwhitespace"/> 
</xsl:template> 

<xsl:template match="text()" mode="stripwhitespace"> 
    <xsl:value-of select="normalize-space(translate(., '\n', ''))"/> 
</xsl:template> 

<xsl:template match="/ | @* | *" mode="stripwhitespace"> 
    <xsl:apply-templates select="."/> 
</xsl:template> 

これは、タグの最高レベルで空白と改行を削除して、変換を正常に進めることができたという私の問題を解決しました。暗くなった疑問に対する謝罪と、あなたの援助に感謝します。

EDIT the second: 'translate'の使用は期待通りに機能しません。文字単位で動作します。代わりに部分文字列を置き換える変換を使用しました。

+0

XML入力のreprsentative例を与えてください。 –

+0

\ n 何か脚注のあるタイトルに似ていますこれは脚注です。そして完了しました\ n Snow

+0

私が追加しなければならない例は、私が扱っているタイトルxmlの例ですが、変換は複数の段落を持つ大量の大量のテキストを受け取り、 – Snow

答えて

0

を:。

\ nリテラルでない場合は、次のようにしてください:

<xsl:template match="text()[ancestor-or-self::no_whitespace]"> 
    <xsl:value-of select="normalize-space(.)"/> 
</xsl:template> 

no_whitespaceタグ以下のすべての空白をクリーンアップします。

\ nが文字列内のリテラルである場合、\ nを取り除くために少し複雑になります。この使用します。どちらの場合も

<xsl:template name="strip_newline"> 
    <xsl:param name="string"/> 
    <xsl:value-of select="substring-before($string,'\n')"/> 
    <xsl:variable name="rhs" select="substring-after($string,'\n')"/> 
    <xsl:if test="$rhs"> 
     <xsl:call-template name="strip_newline"> 
      <xsl:with-param name="string" select="$rhs"/> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="text()[ancestor-or-self::no_whitespace]"> 
    <xsl:value-of select="normalize-space(.)"/> 
</xsl:template> 

<xsl:template match="text()[ancestor-or-self::no_whitespace][contains(.,'\n')]"> 
    <xsl:variable name="cleantext"> 
     <xsl:call-template name="strip_newline"> 
      <xsl:with-param name="string" select="."/> 
     </xsl:call-template> 
    </xsl:variable> 
    <xsl:value-of select="normalize-space($cleantext)"/> 
</xsl:template> 

を、私はあなたがすでに他の場所であなたのXSLの代わりに、アイデンティティーテンプレートを持っていると仮定しています:

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

normalize-spaceを使用すると、フラグメントのテキスト値のみが使用され、サブノードが削除されます。あなたの<xsl:apply-templates/>

+0

残念ながら、私はnormalize-spaceを他のテンプレートに入れることはできません。 – Snow

+0

しかし、これらの改行は表示されたコードで削除されますか?そうでなければ、 'mode =" removewhite "'(例えば)と 'text()'の正規化スペースを行う内部( 'identity = transform xslt 'を検索し、難しさが戻ってきます;-) –

+0

解答として、これを記入してください。 – Snow

0

によって適用されているものは、それが出力にだけインデントをcound(およびサブノード用のテンプレートにnormalize-spaceを入れなければならないと思いますが< XSL持っていますか:出力インデント=「はい」を/ >あなたの一番上にあるXSLそれともプロセッサは、インデントをenforceingさ< XSLの使用:?。出力インデントを=「なし」/>すべて\ nとインデントを吸い取る必要があります私は2つのオプションを持っている

+0

改行と余分なスペースは入力データから直接来ています。それは、Marklogicデータベースエントリの中には、タグを持たないタグ内に改行があるデータ問題です。 – Snow

関連する問題