2009-07-15 15 views
4

動作しない私は、すべての着信要求をインターセプトし、受信したXMLから空白を削除し、応答になる「クリーン」XMLを書き込もうとする私のアプリケーションでのサーブレットフィルタを持っています。私はこれを達成するためにXSLTを使用しています。XSLTます。<xsl:ストリップ空間>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:output method="xml" omit-xml-declaration="no" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

しかし、これは期待通りに動作しない:以下XSLTをご参照ください。結果のXMLは< XSLを使用するにもかかわらず、(元のXMLと同じです。ストリップ空間要素=「*」/>スタイルシートで

私はこの権利を得る助けてください

よろしく、
。 - アシシュ

答えて

14

:であると仮定すると

あなたが意味する「すぐに開いた後やタグを閉じる前にすべての空白を削除する」「トリム」、さらに次のテンプレート規則は、トリックを行う必要があります、<xsl:template match="text()"><xsl:value-of select="normalize-space(.)"/></xsl:template>はこのトリックを行うべきです。

17

あなたが出力として取得するつもり何明確ではない、とあなたが最初の場所でxsl:strip-whitespaceから何を期待しかし、注意すべき一つのことは、それがすべての空白を削除しないことであるが、唯一。 「通常の」規則の下で重要でないとみなされるもの。特に、XSLT 1.0仕様:

それが唯一の空白文字が含まれていない限り、テキストノードが取り除かれることはありません。それは間の3空白のみのテキストノード(<foo>後と<bar>前に、持っていたので

<foo><bar/></foo> 

<foo> 
    <bar> </bar> 
</foo> 

まで剥奪されますので、例えば、これは

<bar>および</bar>、および</bar>の後および</foo>の前)。出力に

<foo> 
    <bar/> 
<foo> 

:あなたはスタイルシートで<xsl:output indent="yes">を持っているので、それが終わるだろうということも

注に変換されます。

は、一方で、この:それに含まれるすべてのテキストノードは、純粋に空白ノードではないので、

<foo> 
    text1 
    <bar> text2 </bar> 
    text3 
</foo> 

は、全く取り除かれることはありません。

+1

このような丁寧な説明パベルに感謝します。実際、機能に関する私の理解は間違っていました。 これは不可能なので、XSLTスタイルシートを使用してすべてのテキストノードの値を 'トリミング'する方法があります。 – Vini

+0

@Winnie - コピーしたノードのテキストをトリミングするソリューションを見つけましたか? –

+1

@MattHuggins 2番目の答えを見ましたか? –

2

これを2番目の回答として追加します。これは、最初の説明の説明が、(うまくいけば)それを保持するのに十分な情報ですからです。元の質問からXSLTを使用して

<xsl:variable name="whitespace">&#x20;&#x9;&#xD;&#xA;</xsl:variable> 

<!-- Trim all whitespace at beginning of string --> 
<xsl:template name="trim-start"> 
    <xsl:param name="text"/> 
    <xsl:variable name="first-char" select="substring($text, 1, 1)" /> 
    <xsl:choose> 
    <xsl:when test="contains($whitespace, $first-char)"> 
     <xsl:call-template name="trim-start"> 
     <xsl:with-param name="text" select="substring($text, 2)" /> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$text" /> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<!-- Trim all whitespace at end of string --> 
<xsl:template name="trim-end"> 
    <xsl:param name="text"/> 
    <xsl:variable name="last-char" select="substring($text, string-length($text), 1)" /> 
    <xsl:choose> 
    <xsl:when test="contains($whitespace, $last-char)"> 
     <xsl:call-template name="trim-end"> 
     <xsl:with-param name="text" select="substring($text, 1, string-length($text) - 1)" />   </xsl:call-template> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$text" /> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<xsl:template match="text()"> 
    <xsl:call-template name="trim-start"> 
    <xsl:with-param name="text"> 
     <xsl:call-template name="trim-end"> 
     <xsl:with-param name="text" select="."> 
     </xsl:call-template> 
    <xsl:param> 
    </xsl:call-template> 
</xsl:template> 
+0

はい、すべてのスペースをトリムする必要があります。助けてください。 – Vini

+0

更新されたバージョンをお試しください。 –

関連する問題