我有以下csv
DATO;JOBSID;JOBNR;TEKST;AFSENDER;MODTAGER
02-06-2017;1234;4321;"MEI KONG ML KL. 00.45-13.00 TLF. NR 1023 0188
SØNDAG ML KL 24.00-11.00 TLF. NR. 6935 0188
Prags Boulevard 49D. Tlf. 3134 5998
Bogpakker: Tlf. 1245 0880
TILLIDSREPRÆSENTANT GRETE WISE: TLF. 21200919";"DI";"ALLE"
最初我使用换行符进行行标记化。但我的数据也包含换行符,我需要保持这些换行符。我尝试用特殊字符替换换行符,然后用换行符替换换行符。但在这种情况下,我无法进行标记化。
我的XSLT如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:f="foo/bar"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output encoding="iso-8859-1" method="xml" indent="yes"/>
<xsl:include href="job-lib.xsl"/><!-- string normalization and other general functions in this library -->
<!-- Parameters -->
<xsl:param name="csv-file"/><!-- the input csv file -->
<xsl:param name="text-encoding" as="xs:string" select="'iso-8859-1'"/>
<xsl:param name="root-element"/><!-- root element name in output file -->
<!-- The direct input to the transformation is an "empty" xml file with (empty) root element "null" -->
<xsl:template match="null">
<xsl:variable name="output-file" select="concat(substring-before($csv-file,'.csv'),'.xml')"/>
<xsl:element name="{$root-element}">
<xsl:variable name="csv-content">
<xsl:for-each select="tokenize(unparsed-text($csv-file,$text-encoding),'
')">
<xsl:element name="row">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="column-names" select="tokenize(string($csv-content/row[1]),';')"/>
<xsl:for-each select="$csv-content/row[position() > 1]">
<xsl:copy>
<xsl:for-each select="tokenize(string(.),';')">
<xsl:variable name="column-pos" select="position()"/>
<xsl:variable name="element-name" select="$column-names[$column-pos]"/>
<xsl:element name="{$element-name}">
<xsl:value-of select="f:normalize(.)"/>
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
必需的XML
<job>
<row>
<DATO>02-06-2017</DATO>
<JOBSID>1234</JOBSID>
<JOBNR>4321</JOBNR>
<TEKST>
"MEI KONG ML KL. 00.45-13.00 TLF. NR 1023 0188
MEI KONG ML KL 24.00-11.00 TLF. NR. 6935 0188
Prags Boulevard 49D. Tlf. 3134 5998
Bogpakker: Tlf. 1245 0880
TILLIDSREPRÆSENTANT GRETE WISE: TLF. 21200919
</TEKST>
<AFSENDER>DI</AFSENDER>
<MODTAGER>ALLE</MODTAGER>
</row>
</job>
请帮助我,如何将我的CSV转换为包含换行符所需的XML格式。
我使用calabash进行转换。
答案 0 :(得分:1)
我不清楚您的样本数据是否具有代表性。如果您的实际数据与您的示例数据完全一致,则可能会进行简单修复 - 您的MODTAGER
字符串是每条记录中的最后一个数据字段,该字符串以"\n
结尾。同时,您的TEKST
字符串(包含换行符的唯一数据字段)从不会有一个紧跟在双引号之前的换行符 - 因此"\n
永远不会匹配TEKST
字符串中的任何内容。因此,您可以安全地在"\n
上进行标记,以便按每条记录分解文件。