如何替换逗号','在将xml转换为csv时使用值

时间:2018-05-25 10:35:10

标签: java xml xslt

我正在将xml转换为csv文件,并且有一个地址字段,其中包含','逗号转换后我的结果不在正确的列下,所以如何替换','在我的xsl文件中包含空格或其他值。

<?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> 

expected output 我的预期输出:

My output 我的输出:

1 个答案:

答案 0 :(得分:1)

最简单的选择是始终在地址字段

周围加上引号
std::initializer_list

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

试试这个XSLT

<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内置模板,无论如何都只输出元素的文本值。

请注意,您的XML具有元素名称<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> 。它可能应该是AdderessLine1