Как заменить запятую ',' значением при конвертации xml в csv - PullRequest
0 голосов
/ 25 мая 2018

Я преобразую 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 голосов
/ 25 мая 2018

Самый простой вариант - всегда ставить кавычки вокруг поля адреса.

<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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...