XSLT 创建 CSV 但维护来自 XML 节点的逗号

Posted

技术标签:

【中文标题】XSLT 创建 CSV 但维护来自 XML 节点的逗号【英文标题】:XSLT create CSV but maintain commas from XML node 【发布时间】:2021-11-01 05:48:43 【问题描述】:

我有一个 XML 文件,我想创建一个在 MS Excel 中打开的 csv 文件。 csv 文件使用逗号作为分隔符,但其中一个 XML 节点中有逗号,Excel 正在读取这些逗号,就好像它们应该在单独的单元格中一样。因此,在我的示例中,Block 1、Block 1+、Block 5、Block 5 可导出,而不是将这些内容保存在一个单元格中,当在 Excel 中打开时,每个逗号都被视为每个逗号的一个新单元格。我尝试使用制表符来分隔 csv,但这不起作用。我也尝试将节点括在引号中。

如何使包含多个逗号的字符串仅填充一个单元格?

XML:
<dmodule>
      <title>ABC DEF</title>
      <applic id="UHK97000-10_UHK97000-12_UHK97000-15_UHK97000-17_UHK97000-18_UHK97000-20_UHK97000-21">
        <displayText>
          <simplePara>Block 1, Block 1+, Block 5, Block 5 Exportable</simplePara>
        </displayText>
     </applic>
     <tminfo>Text that should appear in the next column
     </tminfo>
</dmodule>


XSLT:
<xsl:value-of select="title"/><!-- tab char -->&#9;<xsl:value-of select="simplePara>&#9;<xsl:value-of select="tminfo"><!-- new line char -->&#10;

我也尝试过将逗号字符转义并用双引号括起来,但我无法让我的代码运行。

XSLT:
    <xsl:variable name="keepCommas">
    <xsl:for-each select="simplePara">
        <xsl:text>,</xsl:text>
        <xsl:value-of select="concat('&quot;['simplePara,',']&quot;')"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
    </xsl:variable>

这段代码根本没有呈现任何输出。

我仅限于 XSLT 1.0 版 Microsoft 365 - Excel

【问题讨论】:

好吧,我会创建一个包含逗号的单元格的 Excel 表格,然后将其保存/导出为 CSV 并查看结果并尝试使用 XSLT 重现该结果。另一方面,Excel 有自己的 XML 格式,因此与依赖 CSV 相比,使用 XSLT 为 Excel 生成导入数据的方法可能更复杂但也更智能。 【参考方案1】:

AFAICT 你需要做的只是:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="dmodule">
    <xsl:text>"</xsl:text>
    <xsl:value-of select="title"/>
    <xsl:text>","</xsl:text>
    <xsl:value-of select="applic/displayText/simplePara"/>
    <xsl:text>","</xsl:text>
    <xsl:value-of select="tminfo"/>
    <xsl:text>"&#10;</xsl:text>
 </xsl:template>

</xsl:stylesheet>

【讨论】:

如果我只想将 simplePara 选入一个变量,然后用 select 的值调用该变量呢? 我不明白你为什么要这样做,但你可以。你到底在哪里遇到了麻烦? 我为包含额外逗号的单元格创建了一个变量。您的代码效果很好!谢谢!

以上是关于XSLT 创建 CSV 但维护来自 XML 节点的逗号的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 或 XSLT 将复杂的 XML 转换为 CSV

XSLT 将来自多个节点的属性连接成单个值

XSLT 1.0:CSV 到 XML - 如何分而治之

使用 XSLT 将 CSV 文件转换为 XML

XML to csv 做正确的 xslt

使用 XSLT 重命名节点