我想使用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>
这个简单的转换产生了想要的结果:
<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 提出了结果应该按每行的记录/元组分组的问题。在记录/元组到底应该是什么的问题中没有定义。因此,当前的解决方案解决了仅空白文本节点和缺少逗号的两个问题,但并不旨在将输出分组为记录/元组。
| 归档时间: |
|
| 查看次数: |
4668 次 |
| 最近记录: |