Я новичок в XML / XSL и считаю, что мне нужна функция для этого запроса.
У меня есть форма, в которой должно быть общее количество узлов с тем же именем.
----------------- ИТОГО по разделу --------------------------
<th align = "left"><font size = "2"><xsl:text>Total Freight & Other Charges:
</xsl:text></font></th>
<td><font size = "2"> $<xsl:value-of select='format-number(Document-810/SUMMARY/SAC/SAC05, "###,###,##0.00")'/></font></td>
------------- раздел для отдельных узлов ---------
<xsl:for-each select = "Document-810/SUMMARY/SAC">
<tr>
<th align = "left"><xsl:text>Amount</xsl:text></th>
<td colspan = "2"><font size = "2"><xsl:value-of select = "concat('$', format-number(SAC05 div 100, '###,###,###.00'))" />
</font>
</td>
<th align = "left"><font size = "2"><xsl:text>Description</xsl:text></font></th>
<td colspan = "7"><font size = "2">
<xsl:value-of select = "SAC15"/></font>
</td>
</tr>
</xsl:for-each>





Предполагая, что входной XML, который используется для преобразования, выглядит следующим образом
<Document-810>
<SUMMARY>
<SAC>
<SAC05>1000</SAC05>
<SAC15>Description 1</SAC15>
</SAC>
<SAC>
<SAC05>2000</SAC05>
<SAC15>Description 2</SAC15>
</SAC>
<SAC>
<SAC05>3000</SAC05>
<SAC15>Description 3</SAC15>
</SAC>
<SAC>
<SAC05>4000</SAC05>
<SAC15>Description 4</SAC15>
</SAC>
<SAC>
<SAC05>5000</SAC05>
<SAC15>Description 5</SAC15>
</SAC>
</SUMMARY>
</Document-810>
вы можете использовать следующий фрагмент кода для вычисления суммы значений во всех узлах <SAC05> в контексте узла <SUMMARY>.
<xsl:variable name = "totalAmt" select = "sum(SAC/SAC05) div 100" />
а затем используйте функции concat() и format-number() для отображения значения в формате $XXX.XX.
<xsl:value-of select = "concat('$', format-number($totalAmt, '###,###,##0.00'))"/>
Ниже представлен XSLT, который можно использовать для получения таблицы HTML (вы можете использовать его как ссылку и изменить структуру таблицы в соответствии с вашими требованиями.).
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" >
<xsl:output method = "html" />
<xsl:strip-space elements = "*" />
<xsl:template match = "SUMMARY">
<html>
<body>
<table cellpadding = "3" cellspacing = "0" border = "1">
<tr>
<th align = "left"><font size = "2"><xsl:text>Total Freight & Other Charges:</xsl:text></font></th>
<td align = "left"><font size = "2">
<xsl:variable name = "totalAmt" select = "sum(SAC/SAC05) div 100" />
<xsl:value-of select = "concat('$', format-number($totalAmt, '###,###,##0.00'))"/>
</font></td>
</tr>
<tr>
<th align = "left"><font size = "2"><xsl:text>Amount</xsl:text></font></th>
<th align = "left"><font size = "2"><xsl:text>Description</xsl:text></font></th>
</tr>
<xsl:for-each select = "SAC">
<tr>
<td><font size = "2"><xsl:value-of select = "concat('$', format-number(SAC05 div 100, '###,###,###.00'))" /></font></td>
<td><font size = "2"><xsl:value-of select = "SAC15" /></font></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Выход
Это идеально! Еще раз большое спасибо за вашу помощь.
Предварительно определенные функции представлены, например, в maxtoroq.github.io/xpath-ref или w3.org/TR/xpath-functions. Так что сначала проверьте там, найдете ли вы что-нибудь, что работает. Если вам нужна дополнительная помощь, подумайте о добавлении небольшой, но репрезентативной выборки XML и покажите нам, какие именно значения вы хотите использовать для вычисления общей суммы.