使用 XSLT 文件将 XML 文件转换为 CSV - 创建列

问题描述 投票:0回答:1

任务是编写一个转换,以 HTML 文件和 CSV 文件的形式列出三个文件夹的内容。

HTML 部分已完成,我现在正在处理 CSV 部分。我设法在 CSV 中获得正确的输出,但是每条记录都在一列中,而不是每个值的新列中。这是我的代码的 CSV 部分:

<xsl:if test="report[contains(@output,'csv')]">
      <xsl:result-document href="{$output_file_csv}" encoding="UTF-8" method="text">

<xsl:text>DAM, Titel, AutorIn, ISBN, EB Erstellt, Status, Duplikate</xsl:text>  

        <xsl:text>&#xA;</xsl:text>

        <xsl:for-each select="$prod">

        <xsl:variable name="DAM" select="replace(.,'^.+/(\d\d\d\d\d).+$','$1')"/>

          <xsl:text>&#xA;</xsl:text>

          <xsl:variable name="Titel" select="document(.)//*:title"/>

          <xsl:text>&#xA;</xsl:text>

          <xsl:variable name="AutorIn" select="document(.)//*:creator"/>

          <xsl:text>&#xA;</xsl:text>

          <xsl:variable name="ISBN" select="document(.)//*:source"/>

          <xsl:text>&#xA;</xsl:text>

          <xsl:variable name="EBErstellt" select="document(.)//*:date"/>

          <xsl:text>&#xA;</xsl:text>

          <xsl:variable name="Status" select="subsequence($status,number(replace(.,'^.+_(\d)%20PRODUKTION.+$','$1')),1)"/>

            <xsl:variable name="Duplikate" select="if (count(index-of(document($prod)//*:source,document(.)//*:source)) &gt; 1) then ', Duplikat' else ''"/>

          <xsl:text>&#xA;</xsl:text>

          <xsl:value-of select="concat($DAM, ', ', $Titel, ', ', $AutorIn, ', ', $ISBN, ', ', $EBErstellt, ', ', $Status, $Duplikate)"></xsl:value-of>
          
          <xsl:text>&#xA;</xsl:text>
          
        </xsl:for-each>-->

      </xsl:result-document>
    </xsl:if>
  </xsl:template>

任何人都可以帮助创建 CSV 标题并将每个值映射到相应的列吗?

xml csv xslt xslt-2.0
1个回答
0
投票

有两件事:

首先,您在每列之间添加了一个新行

<xsl:text>&#xA;</xsl:text>
,而不是逗号:
<xsl:text>,</xsl:text>

其次,您没有考虑到其中一个字段值包含换行符或逗号的可能性。对于字符串值列,您可以将它们括在双引号字符中,并使用 XPath

replace
函数转义这些字段值中存在的任何双引号。请参阅如何在 CSV 中正确转义双引号?

© www.soinside.com 2019 - 2024. All rights reserved.