java - 使用 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,'
')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
解决方案
最简单的选择是始终在地址字段周围加上引号
<xsl:template match="/">
<xsl:text>Name, Age, Sex, Address
</xsl:text>
<xsl:for-each select="//EmpDetails">
<xsl:value-of select="concat(Name,',',Age,',',Sex,',"',Address/AdderessLine1,'","',JobLocation,'"
')"/>
</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
</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>
</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
推荐阅读
- excel-formula - 是否有 Excel 函数可以将多个数据集映射到同一个日期集
- android - 如何使用我的 BasePresenter 扩展所有视图
- node.js - 如何从 docker -e 变量设置 azure-function 应用程序端口?
- docker - 如何唯一标识从 tar 文件导入的 docker 映像?
- php - 将数据从 vuejs 发送到 laravel
- android - 如何在 connectedDebugAndroidTest 运行之前和之后运行脚本
- windows - 下载后自动打开 ZIP 文件内容
- database - 如何从我的数据库中返回所有行
- c# - 数据库连接抛出一些错误
- ios - 更改数据源时 UICollectionView 中的平滑动画