我需要使用XSLT(与.NET框架兼容)将XML转换为CSV。目前我提出了以下解决方案:
XML:
r.connect()
XSLT:
#pragma omp parallel
{
// I'm using auto, correct the type and initialize as needed
auto f_local = f;
auto sumK_local = sumK;
for (int k = 0; k < numelem[i]; k++)
{
sumK_local = sumK_local - weight[k];
int cmax = 0;
cmax = max(capacity - sumK, weight[k]);
#pragma omp for
for (int c = capacity; c >= cmax; c--)
{
if (f_local[c] < f_local[c - weight[k]] + value[k])
{
f_local[c] = f_local[c - weight[k]] + value[k];
M[capacity * k + c] = 1;
}
}
}
#pragma omp critical
{
for (int c = capacity; c >= cmax; c--)
{
if (f[c] < f_local[c])
{
f[c] = f_local[c];
}
}
}
}
不幸的是,输入XML文件中可能缺少某些标记(并且我无法控制输入)。
因此输出CSV目前看起来像这样:
<items>
<item>
<col1>AAA1</col1>
<col2>BBB1</col2>
<col3>CCC1</col3>
<col4>DDD1</col4>
<col5>EEE1</col5>
</item>
<item>
<col1>AAA2</col1>
<col2>BBB2</col2>
<col5>EEE2</col5>
</item>
<item>
<col1>AAA3</col1>
<col2>BBB3</col2>
<col3>CCC3</col3>
<col4>DDD3</col4>
<col5>EEE3</col5>
</item>
</items>
但我需要的是能够生成如下的CSV:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:csv="csv:csv"
xmlns:ext="http://exslt.org/common">
<xsl:output encoding="utf-8" method="text"/>
<xsl:variable name="delimiter" select="';'"/>
<xsl:variable name="newline" select="'
'"/>
<xsl:variable name="csv_header">
<csv:columns xmlns:csv="csv:csv">
<column>HDR1</column>
<column>HDR2</column>
<column>HDR3</column>
<column>HDR4</column>
<column>HDR5</column>
</csv:columns>
</xsl:variable>
<xsl:variable name="header" select="ext:node-set($csv_header)/*"/>
<xsl:template name="print_value">
<xsl:value-of select="."/>
<xsl:if test="position() != last()">
<xsl:value-of select="$delimiter"/>
</xsl:if>
</xsl:template>
<xsl:template name="gen-header">
<xsl:for-each select="$header/child::*" xmlns:csv="csv:csv">
<xsl:call-template name="print_value"/>
</xsl:for-each>
<xsl:value-of select="$newline"/>
</xsl:template>
<xsl:template name="parse-node">
<xsl:for-each select=".//child::*">
<xsl:if test="count(*) = 0">
<xsl:call-template name="print_value"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template name="parse-data">
<xsl:for-each select="*">
<xsl:call-template name="parse-node"/>
<xsl:value-of select="$newline"/>
</xsl:for-each>
</xsl:template>
<xsl:template match="*">
<xsl:call-template name="gen-header"/>
<xsl:call-template name="parse-data"/>
</xsl:template>
</xsl:stylesheet>
怎么做?
答案 0 :(得分:1)
如果您知道列名称,那么您可以这样做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/items">
<xsl:text>HDR1;HDR2;HDR3;HDR4;HDR5 </xsl:text>
<xsl:for-each select="item">
<xsl:value-of select="col1"/>
<xsl:text>;</xsl:text>
<xsl:value-of select="col2"/>
<xsl:text>;</xsl:text>
<xsl:value-of select="col3"/>
<xsl:text>;</xsl:text>
<xsl:value-of select="col4"/>
<xsl:text>;</xsl:text>
<xsl:value-of select="col5"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>