下面的 XSLT 代码能够从 XML 转换为带引号的 CSV,但子节点(详细信息)出现在同一行中。
XML 输入
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Records>
<TrRecords>
<RecordID>0123</RecordID>
<SequnceNumber>00001</SequnceNumber>
<TNumber>00001</TNumber>
<System>01</System>
<Amount>4956.00</Amount>
<Reference>T</Reference>
<Account>89768</Account>
<Name>bdi</Name>
<Other2/>
<Other3/>
<Details>
<RecordID>1234</RecordID>
<SequnceNumber>00001</SequnceNumber>
<TNumber>00001</TNumber>
<Number>TI</Number>
<InvoiceDate>2024-05-05</InvoiceDate>
<InvoiceDescription/>
<InvoiceAmount>10.00</InvoiceAmount>
</Details>
</TrRecords>
<TrRecords>
<RecordID>0123</RecordID>
<SequnceNumber>00001</SequnceNumber>
<TNumber>00002</TNumber>
<System>01</System>
<Amount>523.00</Amount>
<Reference>TI</Reference>
<Account>18907</Account>
<Name>elci</Name>
<Other2/>
<Other3/>
<Details>
<RecordID>1234</RecordID>
<SequnceNumber>00001</SequnceNumber>
<TNumber>00001</TNumber>
<Number>TIR</Number>
<InvoiceDate>2024-08-17</InvoiceDate>
<InvoiceDescription/>
<InvoiceAmount>5245.00</InvoiceAmount>
</Details>
</TrRecords>
<TrRecords>
<RecordID>0123</RecordID>
<Number>00001</Number>
<TNumber>00003</TNumber>
<System>01</System>
<Amount>1180.00</Amount>
<Reference>EMI</Reference>
<AccountNo>0936201002941</AccountNo>
<Other2/>
<Other3/>
<Details>
<RecordID>1234</RecordID>
<SequnceNumber>00001</SequnceNumber>
<TNumber>00001</TNumber>
<Number>Tac</Number>
<InvoiceDate>2024-08-17</InvoiceDate>
<InvoiceDescription/>
<InvoiceAmount>1180.00</InvoiceAmount>
</Details>
</TrRecords>
</Records>
</Root>
XSLT 代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" />
<xsl:param name="delim" select="','" />
<xsl:param name="quote" select="'"'" />
<xsl:param name="break" select="'
'" />
<xsl:template match="/Root">
<xsl:apply-templates select="Records/TrRecords" />
</xsl:template>
<xsl:template match="TrRecords">
<xsl:apply-templates />
<xsl:if test="following-sibling::*">
<xsl:value-of select="$break" />
</xsl:if>
<xsl:for-each select="Details">
<xsl:if test="following-sibling::*">
<xsl:value-of select="$break" />
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template match="*">
<!-- remove normalize-space() -->
<xsl:value-of select="concat($quote, normalize-space(), $quote)" />
<xsl:if test="following-sibling::*">
<xsl:value-of select="$delim" />
</xsl:if>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
输出 "0123","00001","00001","01","4956.00","T","89768","bdi","","","","","","", “”、“”、“”、“1234 00001 00001 TI 2024-05-05 10.00” "0123","00001","00002","01","523.00","TI","18907","elci","","","","","","", "","","","1234 00001 00001 TIR 2024-08-17 5245.00" "0123","00001","00003","01","1180.00","EMI","0936201002941","","","","","","",""," ","","1234 00001 00001 塔克 2024-08-17 1180.00"
在 1234 的每一行中,值应换行并用引号引起来。你能帮我解决这个问题吗?
问候, 贾纳尔丹
尝试类似:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" />
<xsl:param name="delim" select="','" />
<xsl:param name="quote" select="'"'" />
<xsl:param name="break" select="'
'" />
<xsl:template match="/Root">
<xsl:apply-templates select="Records/TrRecords" />
</xsl:template>
<xsl:template match="TrRecords">
<xsl:apply-templates select="* except Details"/>
<xsl:value-of select="$break" />
<xsl:apply-templates select="Details/*"/>
<xsl:if test="position()!=last()">
<xsl:value-of select="$break" />
</xsl:if>
</xsl:template>
<xsl:template match="*">
<xsl:value-of select="concat($quote, normalize-space(), $quote)" />
<xsl:if test="position()!=last()">
<xsl:value-of select="$delim" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>