在XSLT中的值周围加上双引号

时间:2013-08-15 03:20:18

标签: xslt double-quotes

我有一个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。
  • 使用和选择变量。

有什么建议吗?

2 个答案:

答案 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格式。