У меня проблемы с правильной формулировкой преобразования.Я генерирую файлы CSV.Я могу легко сгенерировать следующий csv:
"version","","stuff",
"version1version2","annotation1annotation2","yadda",
Однако я хотел бы, чтобы различные экземпляры подполей были разделены запятыми в своей строке следующим образом:
"version","","stuff",
"version1,version2","annotation1,annotation2","yadda",
Myввод выглядит примерно так:
<?xml version="1.0" encoding="UTF-8"?>
<collection>
<record>
<datafield tag="020">
<subfield code="a">version</subfield>
</datafield>
<datafield tag="040">
<subfield code="b">stuff</subfield>
</datafield>
</record>
<record>
<datafield tag="020">
<subfield code="a">version1</subfield>
<subfield code="9">annotation1</subfield>
</datafield>
<datafield tag="020">
<subfield code="a">version2</subfield>
<subfield code="9">annotation2</subfield>
</datafield>
<datafield tag="040">
<subfield code="b">yadda</subfield>
</datafield>
</record>
</collection>
Использование следующих xsl (и xsltproc)
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="collection/record"/>
</xsl:template>
<xsl:template match="record">
<xsl:text>"</xsl:text>
<xsl:apply-templates select="datafield[@tag='020']/subfield[@code='a']"/>
<xsl:text>",</xsl:text>
<xsl:text>"</xsl:text>
<xsl:apply-templates select="datafield[@tag='020']/subfield[@code='9']"/>
<xsl:text>",</xsl:text>
<xsl:text>"</xsl:text>
<xsl:apply-templates select="datafield[@tag='040']/subfield[@code='b']"/>
<xsl:text>",</xsl:text>
<xsl:text>
</xsl:text>
</xsl:template>
Я бы предположил, что некоторая комбинация follow-sibling :: or not (position () = last()) будет задействован call-template, но я еще не нашел рабочего решения.Любая помощь?
Я не ищу универсальное преобразование XML в CSV - все, что связано с этим конкретным набором данных, хорошо.