2016-09-28 17 views
2

をエスケープ私はこのスキーム次XMLファイルがありますので、「currentValueは」におけるセミコロンのXSLT 1.0:二重引用符

<translationData> 
<product> 
<attributeValue> 
<value>1/4"</value> 
<value1>1/4"</value1> 
<currentValue>aaaa;bbbb</currentValue> 
</attributeValue> 
</product> 
</translationData> 

iが「値」でセミコロンと二重引用符をエスケープする必要があります。 私は、次のようqoutes内のすべてのテキストを配置することによって、セミコロンを脱出することができる午前:

XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" encoding="utf-8" /> 

    <xsl:param name="delim" select="';'" /> 
    <xsl:param name="quote" select="'&quot;'" /> 
    <xsl:param name="break" select="'&#xA;'" /> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="translationData/product/attributeValue" /> 
    </xsl:template> 

    <xsl:template match="attributeValue"> 
    <xsl:apply-templates /> 
    <xsl:if test="following::*"> 
     <xsl:value-of select="$break" /> 
    </xsl:if> 
    </xsl:template> 


    <xsl:template match="*"> 
    <!-- remove normalize-space() if you want keep white-space at it is --> 

    <xsl:value-of select="concat($quote, translate(.,'&quot;','\&quot;'), $quote)" /> 
    <xsl:if test="following-sibling::*"> 
     <xsl:value-of select="$delim" /> 
    </xsl:if> 
    </xsl:template> 

    <xsl:template match="text()" /> 
</xsl:stylesheet> 

何とか出力は次のとおりです。

"1/4 \"。 "1/4 \"; "AAAA、BBBB"

の代わり

" "\ 1/4" 0

;" 1/4 "\"; "AAAA、BBBB" 私は間違っているつもりです

私はXMLとXSLTを初めて使用しており、この特定のケースを扱う質問は見つかりませんでした。


XSLTコードは別の質問のための@Tomalakの回答です。 here

+0

? –

+0

クレジットを与えずに他人のコードを投稿しないでください。このXSLTをhttp://stackoverflow.com/a/365372/18771からコピーしました。あなたがコードを書くときはいつも、自分で書くことはしませんでした。 – Tomalak

+0

@ michael.hor257kはそこにはいけません。今すぐ削除しました。 –

答えて

0

translate()の機能は、それぞれの文字を別の文字に置き換えます。単一文字です。あなたのプロセッサがサポートしている場合 - - などEXSLT str:replace()などの拡張機能2文字列\"名前付き再帰テンプレートまたはを使用する必要があるとの単一の文字"を置き換えるために

。ここで

は、再帰的なテンプレートを使用しての例です: `R`から来たん

... 

<xsl:template match="*"> 
    <xsl:text>"</xsl:text> 
    <xsl:call-template name="replace"> 
     <xsl:with-param name="text" select="."/> 
    </xsl:call-template> 
    <xsl:text>"</xsl:text> 
    <xsl:if test="position()!=last()"> 
     <xsl:text>;</xsl:text> 
    </xsl:if> 
</xsl:template> 

... 

<xsl:template name="replace"> 
    <xsl:param name="text"/> 
    <xsl:param name="searchString">"</xsl:param> 
    <xsl:param name="replaceString">\"</xsl:param> 
    <xsl:choose> 
     <xsl:when test="contains($text,$searchString)"> 
      <xsl:value-of select="substring-before($text,$searchString)"/> 
      <xsl:value-of select="$replaceString"/> 
      <!-- recursive call --> 
      <xsl:call-template name="replace"> 
       <xsl:with-param name="text" select="substring-after($text,$searchString)"/> 
       <xsl:with-param name="searchString" select="$searchString"/> 
       <xsl:with-param name="replaceString" select="$replaceString"/> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$text"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

... 
+0

完璧に動作し、私の質問に完全に答えます!どうもありがとう! –

+0

あなたのコードは、まさにそれと同じように動作します。しかし今、私の質問は正しいとは言えません。出力は次のとおりです。 "1/4 \" ";" 1/4 \ ""; ""; "currentValue"が空の場合。問題はない。しかし、私はExcelでCSVを開くや否や、それは次のように一つのセルに出力を表示します。 1/4 \「; 1/4 \」」 が、それは別の細胞にそれを置く必要があります 私はこの問題と考えました。 –

+0

'replaceString'パラメータを' "" 'に変更してみてください:https:/を参照してください。 /en.wikipedia。org/wiki/Comma-separated_values#標準化 –

関連する問題