4

我有一个 XSLT 模板,它将地址数据输出为 CSV。我想将一些值用双引号括起来,因为它们包含逗号作为地址数据的一部分。

我的问题是转换后,双引号丢失了。我可以让处理器插入几乎任何东西,但不能插入我想要的双引号。

这是一些示例代码:

<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

作为对您的评论的回应,我认为这里的问题在于 Microsoft Excel,而不是 XSLT。引号被视为文本分隔符,通常您只会在有一个带逗号的字段时使用它们,以表明它只是一个字段,而不是两个。在任何情况下,当您将 CSV 文件读入 Microsoft Excel 时,它不会显示任何文本分隔符(无论该字段是否包含逗号),只显示其中的文本。引号不被视为字段中文本的一部分,而只是用于分隔字段中可能包含特殊字符的文本。

此外,当您将文件保存为 CSV 文件时,Excel 将仅在需要时使用文本分隔符(即,当字段包含逗号时)。如果 CSV 文件在不包含逗号的字段周围有引号,例如在您的示例中10,"SMITH",ST,则在保存时会删除这些引号。

为了证明这一点,请在浏览器中提供之前尝试将文件重命名为 .txt 文件(因此它应该在 IE 或记事本中打开),并查看数据是否符合预期。

如果打算将引号作为实际字段文本的一部分,而不是作为分隔符,则需要在数据周围输出三个引号

<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”周围看到一组引号。

这里需要三个引号,因为最外面的是文本分隔符,然后一对连续引号在实际字段中被视为单引号。

于 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 回答