Как получить сумму чисел, присутствующих в строке? - PullRequest
0 голосов
/ 22 июля 2011

Итак, у меня есть XML-файл, и я использую XSLT для формирования HTML-страницы. мой заголовок в XML содержит текст, за которым следует ::, за которым следует число. Мне удалось извлечь число, но я не знаю, как сложить числа.

<xsl:value-of select="number(substring-after(/searchresult/document[@id = current()/@refid]/title, ' ::'))/>        

Если я делаю

 <xsl:value-of select=" sum(number(substring-after(/searchresult/document[@id = current()/@refid]/title, ' ::')))>

это показывает мне следующую ошибку:

Ошибка: значение не является набором узлов

Я даже попытался создать переменную и сохранить в ней значения и попытался суммировать ее следующим образом:

<xsl:variable name="total">     
    <xsl:value-of select="number(substring-after(/searchresult/document[@id = current()/@refid]/title, ' ::'))"/>   
</xsl:variable>     
<xsl:value-of select="($total)"/>
<xsl:copy-of select="sum($total)"/> 

Но тогда он показывает мне эту ошибку:

Ошибка: невозможно обработать фрагмент дерева результатов как набор узлов в XSLT 1,0

Как получить сумму чисел, которые я проанализировал из заголовка? Пожалуйста, помогите мне ... Я потерялся. Я действительно ценю твою помощь. Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 июля 2011

Ваше описание вводит в заблуждение, поскольку предполагает наличие только одного заголовка и, следовательно, только одного номера. Давайте предположим, что числа находятся в узлах, выбранных с помощью //title.

В XSLT 2.0 все просто:

sum(for $x in //title return number(substring-after($x, '::')))

В XSLT 1.0 есть три способа суммирования набора чисел, которые вычисляются, а не отображаются непосредственно в источнике. Ни один из них не может быть описан как легкий.

(а) использовать двухфазное преобразование. Создайте временное дерево, узлы которого содержат числа, используйте расширение xx: node-set (), чтобы преобразовать его в набор узлов, затем примените функцию sum () к набору узлов.

(b) использовать рекурсию: написать рекурсивный именованный шаблон, который многократно вызывает себя для обработки каждого узла и накапливает общее количество, пока не останется ни одного узла для обработки

(c) использовать функции высшего порядка, доступные в библиотеке FXSL Дмитрия Новатчева.

0 голосов
/ 22 июля 2011

Мне обычно нравится использовать фрагменты XML для подобных вещей.

<xsl:variable name="Counter">
    <xsl:for-each select="TITLETAG">
        <Number>
            <xsl:value-of select="substring-after(/title, ' ::')"/> 
        </Number>
    </xsl:for-each>
</xsl:variable>
<xsl:value-of select="sum(number($Counter/*:Number/text()))" />

Это должно дать вам решение или, по крайней мере, преимущество, при условии, конечно, что существует более 1 элемента заголовка. Не забудьте изменить TITLETAG на ваш титульный элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...