4

住所データを CSV として出力する XSLT テンプレートがあります。アドレス データの一部としてコンマが含まれているため、一部の値を二重引用符で囲みます。

私の問題は、変換後に二重引用符が欠落していることです。プロセッサにほとんど何でも挿入させることができますが、必要な二重引用符は挿入できません。

サンプルコードは次のとおりです。

<xsl:value-of select="./*/*/LotNumber"/>
<xsl:value-of select="$delim"/>
<xsl:value-of select="./*/*/StreetName"/>
<xsl:value-of select="$delim"/>
<xsl:value-of select="./*/*/StreetType"/>

以前に $delim を次のように定義しました。

<xsl:param name="delim" select="','" />

したがって、このテンプレートの一部は、たとえば次のように出力されます。

10,SMITH,ST

引数のために、通りの名前を二重引用符で囲み、次のようにするとします。

10,"SMITH",ST

私はさまざまなことを試しましたが、それらはすべて、二重引用符を次のように宣言するというテーマのバリエーションです。

<xsl:param name="quote">"</xsl:param>

そして、私の値を次のようにラップします:

<xsl:value-of select="$quote"/>
<xsl:value-of select="./*/*/StreetName"/>
<xsl:value-of select="$quote"/>

しかし、変換が実行されると、何も得られません。以前と同じように見えます。私が試した他のことは次のとおりです。

  • テンプレートに二重引用符をリテラルとして入れます。完全に物事を台無しにします。
  • " の代わりに " を使用します。とにかくhtmlではなくテキストとして出力しています。
  • 変数の使用と選択。

助言がありますか?

4

2 に答える 2

6

あなたのコメントに応えて、問題は XSLT ではなく Microsoft Excel にあると思います。引用符はテキストの区切り文字として扱われ、通常はコンマを含むフィールドがある場合にのみ使用し、2 つではなく 1 つのフィールドであることを示します。どのような場合でも、CSV ファイルを Microsoft Excel に読み込むと、(フィールドにカンマが含まれているかどうかに関係なく) テキスト区切り記号は表示されず、その中のテキストのみが表示されます。引用符は、フィールド内のテキストの一部とは見なされず、特殊文字が含まれている可能性があるフィールド内のテキストを区切るために使用されます。

さらに、ファイルを CSV ファイルとして保存すると、Excel は必要な場合 (つまり、フィールドにコンマが含まれる場合) にのみテキスト区切り記号を使用します。の例のように、CSV ファイルにカンマを含まないフィールドが引用符で囲まれている場合10,"SMITH",ST、これらは保存時に削除されます。

これを証明するには、ブラウザで提供する前にファイルの名前を .txt ファイルに変更してみて (IE またはメモ帳で開く必要があります)、データが期待どおりかどうかを確認してください。

実際のフィールド テキストの一部として引用符を使用し、区切り記号として扱わない場合は、データの周りに 3 つの引用符を出力する必要があります。

<xsl:param name="delim" select="','" />
<xsl:param name="quote">"</xsl:param>

<xsl:value-of select="./*/*/LotNumber"/>
<xsl:value-of select="$delim"/>
<xsl:value-of select="$quote"/>
<xsl:value-of select="$quote"/>
<xsl:value-of select="$quote"/>
<xsl:value-of select="./*/*/StreetName"/>
<xsl:value-of select="$quote"/>
<xsl:value-of select="$quote"/>
<xsl:value-of select="$quote"/>
<xsl:value-of select="$delim"/>
<xsl:value-of select="./*/*/StreetType"/>

ということで、テキストとしては以下のように出力されます

10,"""SMITH""",ST

Excel で開くと、"Smith" が一組の引用符で囲まれているはずです。

最も外側がテキスト区切り文字であるため、ここでは 3 つの引用符が必要です。次に、連続する引用符のペアが実際のフィールドで単一引用符として扱われます。

于 2013-08-19T12:50:44.163 に答える
1

コードで次のアプローチを使用します。

<xsl:output method="text" encoding="utf-8"/>
<xsl:strip-space elements="*"/>

<!-- Set the seperator and terminator to match CSV Styling-->
<xsl:variable name="separator">","</xsl:variable>
<xsl:variable name="terminator">"</xsl:variable>
<xsl:template match="/">

<!-- HEADER ROW -->
<xsl:result-document method="text" href="file:///Z:\Desktop Folder/XSLT_Results.csv">
<xsl:value-of select="$terminator"/>
<xsl:text>Lot Number</xsl:text>
<xsl:value-of select="$separator"/>
<xsl:text>Street Name</xsl:text>
<xsl:value-of select="$terminator"/>
<xsl:value-of select="'&#xA;'"/>

<!-- VALUE FIELDS BELOW -->
<xsl:for-each select="OrgRefData:OrgRefData/Organisations/Organisation">
<xsl:choose>

<!-- LIMIT RESULT SET-->
<xsl:when test="WhenTestExpression = true]">

<xsl:value-of select="$terminator"/>
<xsl:value-of select="LotNumber"/>
<xsl:value-of select="$separator"/>
<xsl:value-of select="StreetName"/>
<xsl:value-of select="$terminator"/>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:for-each>
</xsl:result-document>
</xsl:template>

変数を使用するということは、適切な区切り文字を展開して、慎重かつ構造化された方法で CSV フォーマットを正確に一致させることができるということです。

于 2016-01-26T12:00:40.400 に答える