首页 > 解决方案 > 使用 XSLT 将 xml 转换为 csv 时,将逗号 ',' 替换为一个值

问题描述

我正在尝试将 XML 文件转换为 CSV 文件。XML 文件有一个地址字段,其中包含“,”逗号,因此转换后我的结果不属于正确的列,那么如何在我的 XML 文件中用空格或其他值替换“,”。

<?xml version="1.0" encoding="UTF-8"?>
<Details>
    <EmpDetails>
        <Name>AAA</Name>
        <Age>51</Age> 
        <Sex>M</Sex>
        <Address>
            <AdderessLine1>25, SilverStreet</AdderessLine1>
            <AdderessLine2></AdderessLine2>               
        </Address>
        <JobLocation>India</JobLocation>
    </EmpDetails>
    <EmpDetails>
        <Name>BBB</Name>
        <Age>62</Age> 
        <Sex>M</Sex>
        <Address>
            <AdderessLine1>12, GoldStreet</AdderessLine1>
            <AdderessLine2></AdderessLine2>               
        </Address>
        <JobLocation>China</JobLocation>
    </EmpDetails>
<Details>

上面的 xml 只是用于解释我的问题的示例。
以下文件是示例 xsl 文件:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >
  <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>

  <xsl:template match="/"> Name, Age, Sex, Address
    <xsl:for-each select="//Details">
      <xsl:value-of select="concat(Name,',',Age,',',Sex,',',Address,'&#xA;')"/>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet> 

预期产出 我的预期输出:

我的输出 我的输出:

标签: javaxmlxslt

解决方案


最简单的选择是始终在地址字段周围加上引号

<xsl:template match="/"> 
  <xsl:text>Name, Age, Sex, Address&#xA;</xsl:text>
  <xsl:for-each select="//EmpDetails">
    <xsl:value-of select="concat(Name,',',Age,',',Sex,',&quot;',Address/AdderessLine1,'&quot;,&quot;',JobLocation,'&quot;&#xA;')"/>
  </xsl:for-each>
</xsl:template>

如果您只想在字段中有逗号的情况下执行此操作,则可以使用模板添加逻辑以检查逗号

试试这个 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >
  <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>

  <xsl:template match="/"> 
    <xsl:text>Name, Age, Sex, Address, JobLocation&#xA;</xsl:text>
    <xsl:for-each select="//EmpDetails">
      <xsl:value-of select="concat(Name,',',Age,',',Sex)"/>
      <xsl:text>,</xsl:text>
      <xsl:apply-templates select="Address/AdderessLine1" />
      <xsl:text>,</xsl:text>
      <xsl:apply-templates select="JobLocation" />
      <xsl:text>&#xA;</xsl:text>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="*[contains(., ',')]">
    <xsl:text>"</xsl:text>
    <xsl:value-of select="." />
    <xsl:text>"</xsl:text>
  </xsl:template>

</xsl:stylesheet> 

在字段中没有逗号的情况下,应用 XSLT 的内置模板,无论如何它只会输出元素的文本值。

请注意,您的 XML 具有元素名称AdderessLine1。应该是AddressLine1


推荐阅读