Я бы хотел преобразовать XML в CSV с помощью XSLT, но при применении XSL из потока SO под названием XML To CSV XSLT против моего ввода:
<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,
Моя проблема заключается в том, что в результате преобразования отсутствуют узлы (например, элемент DomainName, содержащий IP-адрес), а некоторые дочерние узлы объединяются без запятых (как дочерние элементы AbuseContact).
Я бы хотел видеть все выходные данные XML в форме CSV и такие строки, как: "abuse@iana.orgInternet Corporation для присвоенных имен и номеров + 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>