【问题标题】:Put double quotes around a value in XSLT在 XSLT 中为值加上双引号
【发布时间】:2013-08-17 05:42:21
【问题描述】:

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

有什么建议吗?

【问题讨论】:

  • 使用 $quote 的代码是正确的,应该可以工作。在运行之前检查基本的事情,比如你保存了样式表(并清除了缓存)。
  • @MichaelKay 做到了,不高兴。通过在参数中使用两个双引号,我确实取得了更大的成功,即 ,但是这种行为很奇怪,因为它会在周围加上很多双引号相邻的字段。我不得不承认,现在我只是不明白这里发生了什么。
  • 对不起,如果这是一个光顾的问题,但是您使用什么来查看转换后创建的 CSV 文件?一个普通的旧文本编辑器,还是像 Microsoft Excel 这样的完整电子表格应用程序?
  • @TimC 该文件被传送到浏览器(它是一个网络应用程序),因此它在 Excel 中的浏览器中打开。我保存它(以 CSV 格式),然后在 Notepad++ 中打开它以查看实际交付的内容。

标签: xslt double-quotes


【解决方案1】:

针对您的评论,我认为这里的问题在于 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”周围看到一组引号。

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

【讨论】:

  • 这就成功了,蒂姆。一直都是 Excel。我将 MIME 类型更改为 text/plain 以查看处理器在中间没有 Excel 的情况下吐出什么,你瞧,它完全按照 XSLT 的规定执行。该死的Excel!
  • 这是一个很好的答案,但将其作为变量而不是参数可能是传达意图的更好主意。
【解决方案2】:

我在我的代码中使用以下方法:

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

【讨论】:

    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多