我有一个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"/>
但是当转型运行时,我什么都没得到。它看起来和以前一样。我尝试过的其他事情是:
有什么建议吗?
答案 0 :(得分: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”周围看到一组引号。
这里需要三个引号,因为最外面的是文本分隔符,然后一对连续引号在实际字段中被视为单引号。
答案 1 :(得分:1)
我在代码中使用以下方法:
public override int Count
{
get
{
Console.WriteLine($"Fragment Count: {_fragments.Count}");
return _fragments.Count;
}
}
public override V4.Fragment GetItem(int position)
{
return _fragments[position];
}
使用变量意味着我可以部署适当的分隔符,以便以经过测量和结构化的方式精确匹配CSV格式。