bugfix> java > 投稿

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>

私の期待される出力: 

私の出力:

回答 1 件
  • 最も簡単なオプションは、アドレスフィールドを常に引用符で囲むことです。

    <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 になるはずです

あなたの答え