Я построил XSL (v2.0) ниже, чтобы преобразовать файл CSV в файл XML. Этот бит отлично работает! Часть, на которой я застрял:
- Суммирование всех значений в атрибуте "сумма" во всех элементах "поступления"
- Затем введите сумму в атрибуте "record_total" в "IMPORT_HEADER"
XML, полученный после запуска XSLT, выглядит следующим образом, за исключением record_total, который не рассчитывается (бит, который я не могу получить) ...
<IMPORT_HEADER record_count="3" record_total="175.00" >
<receipt account_code="12345678" amount="25.00" />
<receipt account_code="23456789" amount="50.00" />
<receipt account_code="34567891" amount="100.00" />
</IMPORT_HEADER>
Ниже приведен мой XSL, основанный на моем тестовом CSV-файле, содержащем 3 строки:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" >
<xsl:output method="xml" indent="yes"/>
<!-- Parameter used to specify the file location and name of the CSV file -->
<xsl:param name="pathToCSV" select="'file:///c:/csv.csv'" />
<xsl:template match="/">
<xsl:choose>
<xsl:when test="unparsed-text-available($pathToCSV)">
<!-- Read the CSV file and return its contents as a string -->
<xsl:variable name="csv" select="unparsed-text($pathToCSV)" />
<!-- Split the csv string into individual rows -->
<xsl:variable name="rows" select="tokenize($csv, '\r?\n')" />
<!-- Create the root element node and namespace declarations -->
<IMPORT_HEADER>
<!-- Creates the attributes within the root element node -->
<xsl:attribute name="record_count" select="count($rows)-1"/>
<xsl:attribute name="record_total" select="'636.13'"/>
<!-- Process each row in the CSV file, skip row 1 which contains the column headers -->
<xsl:for-each select="$rows[position() !=1]">
<!-- Split each row into a comma separated list of columns -->
<xsl:variable name="cols" select="tokenize(., ',')" />
<!-- Create the child receipt node and populate the attributes -->
<receipt>
<xsl:attribute name="account_code" select="'12345678'" />
<xsl:attribute name="amount" select="$cols[12]"/>
</receipt>
</xsl:for-each>
</IMPORT_HEADER>
</xsl:when>
<xsl:otherwise>
<xsl:text>Cannot locate : </xsl:text><xsl:value-of select="$pathToCSV" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Любая помощь будет высоко ценится!
Подписал начинающего XSL, становящегося опасным! :)