使用XSLT帮助将XML转换为CSV

Ada*_*ava 6 csv xslt

我想使用XSLT将XML转换为CSV,但是在针对我的输入应用标题为XML To CSV XSLT的SO线程中的XSL时:

<WhoisRecord>
  <DomainName>127.0.0.1</DomainName>
  <RegistryData>
    <AbuseContact>
      <Email>abuse@iana.org</Email>
      <Name>Internet Corporation for Assigned Names and Number</Name>
      <Phone>+1-310-301-5820</Phone>
    </AbuseContact>
    <AdministrativeContact i:nil="true"/>
    <BillingContact i:nil="true"/>
    <CreatedDate/>
    <RawText>...</RawText>
    <Registrant>
      <Address>4676 Admiralty Way, Suite 330</Address>
      <City>Marina del Rey</City>
      <Country>US</Country>
      <Name>Internet Assigned Numbers Authority</Name>
      <PostalCode>90292-6695</PostalCode>
      <StateProv>CA</StateProv>
    </Registrant>
    <TechnicalContact>
      <Email>abuse@iana.org</Email>
      <Name>Internet Corporation for Assigned Names and Number</Name>
      <Phone>+1-310-301-5820</Phone>
    </TechnicalContact>
    <UpdatedDate>2010-04-14</UpdatedDate>
    <ZoneContact i:nil="true"/>
  </RegistryData>
</WhoisRecord>

我最终得到:

  abuse@iana.orgInternet Corporation for Assigned Names and Number+1-310-301-5820,
    ,
    ,
    ,
    ...,      
    4676 Admiralty Way, Suite 330Marina del ReyUSInternet Assigned Numbers Authority90292-6695CA,      
    abuse@iana.orgInternet Corporation for Assigned Names and Number+1-310-301-5820,      
    2010-04-14,
Run Code Online (Sandbox Code Playgroud)

我的问题是,生成的转换缺少节点(如包含IP地址的DomainName元素),并且一些子节点连接而没有逗号(如AbuseContact的子节点).

我希望以CSV格式看到所有XML输出,以及字符串:"abuse@iana.orgInternet Corporation for Assigned Names and Number + 1-310-301-5820",用逗号分隔.

我的XSL非常生疏.非常感谢您的帮助.:)

这是我正在使用的XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>

<xsl:strip-space elements="*" />

<xsl:template match="/*/child::*">
  <xsl:for-each select="child::*">
    <xsl:if test="position() != last()"><xsl:value-of select="normalize-space(.)"/>,    </xsl:if>
    <xsl:if test="position()  = last()"><xsl:value-of select="normalize-space(.)"/><xsl:text>
</xsl:text>
  </xsl:if>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Dim*_*hev 5

这个简单的转换产生了想要的结果

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>
 
    <xsl:template match="/">
    <xsl:apply-templates select="//text()"/>
    </xsl:template>
    
    <xsl:template match="text()">
      <xsl:copy-of select="."/>
      <xsl:if test="not(position()=last())">,</xsl:if>
    </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

请注意使用:

 <xsl:strip-space elements="*"/>
Run Code Online (Sandbox Code Playgroud)

丢弃任何纯空白文本节点。

更新:AJ 提出了结果应该按每行的记录/元组分组的问题。在记录/元组到底应该是什么的问题中没有定义。因此,当前的解决方案解决了仅空白文本节点和缺少逗号的两个问题,但并不旨在将输出分组为记录/元组。

  • 从什么构成记录元组的问题中并不清楚——这在关系数据库世界中有意义,但对于树来说需要显式定义。我还编辑了我的答案以反映您的评论。 (2认同)
  • @Adam-Kahtava:一旦定义了元组应包含的内容,实现元组/集合应该不难。 (2认同)