首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML到CSV使用XSLT对单个标记中以空格分隔的多个记录

XML到CSV使用XSLT对单个标记中以空格分隔的多个记录
EN

Stack Overflow用户
提问于 2021-02-09 04:51:27
回答 1查看 133关注 0票数 3

我们正在尝试使用XSLT将XML转换为CSV。我试过这个链接XML to CSV Using XSLTConverting XML to CSV (using XSLT)

  • --它正在将普通xml转换为csv,但在我的示例中,我无法获得所需的输出。在我的示例中,
  • 有多条记录,它们在单个标记中由空格分隔,如下面的xml input.

所述。

Eg:-项目和评级标签包含由空格分隔的多个记录。

输入XML:

代码语言:javascript
复制
<?xml version = "1.0"?> 
<?xml-stylesheet type = "text/xsl" version="2.0" href = "csvconverted.xsl"?> 
<TestData>
<project>Project-1 Project-2 Project-3</project>
<rating>2 3 5</rating>
<date>21-12-2018 21-06-2020 21-12-20</date>
</TestData>

XSL:-

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />

  <xsl:param name="delim" select="','" />
  <xsl:param name="quote" select="'&quot;'" />
  <xsl:param name="break" select="'&#xA;'" />

  <xsl:template match="/">
    <xsl:apply-templates select="TestData" />
  </xsl:template>

  <xsl:template match="TestData">
    <xsl:apply-templates />
    <xsl:if test="following-sibling::*">
      <xsl:value-of select="$break" />
    </xsl:if>
  </xsl:template>

  <xsl:template match="*">
    <!-- remove normalize-space() if you want keep white-space at it is --> 
    <xsl:value-of select="concat($quote, normalize-space(), $quote)" />
    <xsl:if test="following-sibling::*">
      <xsl:value-of select="$delim" />
    </xsl:if>
  </xsl:template>

  <xsl:template match="text()" />
</xsl:stylesheet>

预期输出:

代码语言:javascript
复制
project,rating,date
Project-1,2,21-12-2018
Project-2,3,21-06-2020
Project-3,5,21-12-20

使用上述代码的实际输出:-

代码语言:javascript
复制
"Project-1 Project-2 Project-3","2 3 5","21-12-2018 21-06-2020 21-12-20"

如果你能进一步指导我,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-09 09:27:04

我将假设您使用的是XSLT1.0处理器,不支持扩展。

我还假设输入XML的结构是预先知道的,唯一变化的是3个空格分隔字符串中的值数。

XSLT1.0

代码语言:javascript
复制
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/TestData">
    <!-- header -->
    <xsl:text>project,rating,date&#10;</xsl:text>
    <xsl:call-template name="generate-rows">
        <xsl:with-param name="project" select="project"/>
        <xsl:with-param name="rating" select="rating"/>
        <xsl:with-param name="date" select="date"/>
    </xsl:call-template>
</xsl:template>
 
<xsl:template name="generate-rows">
    <xsl:param name="project"/>
    <xsl:param name="rating"/>
    <xsl:param name="date"/>
    <xsl:param name="delimiter" select="' '"/>
    <!-- generate row -->
    <xsl:value-of select="substring-before(concat($project, $delimiter), $delimiter)" />
    <xsl:text>,</xsl:text>
    <xsl:value-of select="substring-before(concat($rating, $delimiter), $delimiter)" />
    <xsl:text>,</xsl:text>
    <xsl:value-of select="substring-before(concat($date, $delimiter), $delimiter)" />
    <xsl:text>&#10;</xsl:text>
    <xsl:if test="contains($project, $delimiter)">
        <!-- recursive call -->
        <xsl:call-template name="generate-rows">
            <xsl:with-param name="project" select="substring-after($project, $delimiter)"/>
            <xsl:with-param name="rating" select="substring-after($rating, $delimiter)"/>
            <xsl:with-param name="date" select="substring-after($date, $delimiter)"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>
 
</xsl:stylesheet>

Demohttps://xsltfiddle.liberty-development.net/3MEdvhL

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66113171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档