2015-11-25 2 views
2

С ниже XML, я хочу, чтобы принимать значения в каждом DESC элемент, извлечь только значение перед INV и добавить их все и напечатать сумму на новый элемент под названием " Всего". Другими словами, если элемент содержит:XSL - сумма значений п

<DESC>TEST SUPPLIER 1    250600FOO    805415446355485  000000002000.00INV 1234</DESC> 

Тогда я только хочу, чтобы извлечь:

000000002000.00 

и сделать это для всех DESC элементов, сложите их вместе и выводить его на элемент под названием Всего. Элемент DESC может появляться n раз. Ниже приведен XML с тремя вхождений:

<?xml version="1.0" encoding="iso-8859-1"?> 
<root> 
    <FOO>OW00007838</FOO> 
    <BAR>1</BAR> 
    <DESC>TEST SUPPLIER 1    250600FOO    805415446355485  000000002000.00INV 1234</DESC> 
    <FOO>OW00007838</FOO> 
    <BAR>2</BAR> 
    <DESC>TEST SUPPLIER 2    050712ACME     000256886355485  000000023020.35INV 65870</DESC> 
    <FOO>OW00007838</FOO> 
    <BAR>4</BAR> 
    <DESC>TEST SUPPLIER 3    050712ABCD       000000698745987  000000049158.68INV 02155</DESC> 
</root> 

А вот мой незаконченный таблицы стилей - Я использую подстроку, чтобы попытаться извлечь значение, но не уверен, что это эффективно. Думал использовать комбинацию подстроки-до и -после вместо:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
xmlns:exsl="http://exslt.org/common"> 
<xsl:output indent="yes"/> 

<xsl:template match="/"> 
<Total> 
    <xsl:variable name="subTotals"> 
    <xsl:for-each select="/root/DESC"> 
    <number> 
    <xsl:value-of select="substring(.,86,16)"/> 
    </number> 
    </xsl:for-each> 
    </xsl:variable> 
    <xsl:value-of select="sum(exsl:node-set($subTotals)/number)"/> 
</Total> 
</xsl:template>  

В настоящее время выход только возвращает 0.

+1

Сначала вы будете хотеть это - ' '. Можете ли вы использовать XSLT 2.0, поскольку у него есть намного лучшие способы сделать это? – samjudson

+0

Да, я могу использовать XSLT 2.0 вместо – Scrat

+0

Спасибо за отзыв - отредактировал оригинальный пост. – Scrat

ответ

1

Попробуйте это,

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

<xsl:template match="/"> 
    <Total> 
    <xsl:value-of select=" 
     sum(/root/DESC/number(tokenize(substring-before(., 'INV'),' ')[last()]))"/> 
    </Total> 
</xsl:template> 

</xsl:stylesheet> 

Результат:

<Total>74179.03</Total> 
+0

Спасибо, работает 100% – Scrat

0

В XSLT вы можете просто сделать это:

<xsl:template match="/"> 
    <Total><xsl:value of select="sum(/root/DESC/number(substring(., 86,16)))</Total> 
</xsl:template> 

Ключом является обертка подстроки в number(), чтобы убедиться, что она преобразуется в число. Это может помочь и в вашей версии XSLT 1.0, но я не уверен.

Кроме того, ваши данные выглядят бесполезными. В первом DESC номер начинается на 76, в то время как в прошлом она начинается в 87.

Смежные вопросы