powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Проблема с форматом числа
10 сообщений из 10, страница 1 из 1
Проблема с форматом числа
    #35591743
Alexvmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть древовидное двухуровневое XML с десятичными числами, разделяющие целую и дробную часть запятой. Преобразую этот XML с помощью XSL. Необходимо выводить итог, то есть суммировать все эти десятич. числа.
При этом возникает проблема.
Изначально делал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
...
    <xsl:decimal-format name="format1" grouping-separator=" " decimal-separator=","/>
...
<tfoot>
  <tr>
     <td colspan="7">
        <xsl:text>Итого:</xsl:text>
    </td>
    <td>
        <xsl:value-of select="format-number(number(sum($XML/NewDataSet/Table/SUMM_INSIDE)),'#####0,00' ,  'format1')"/>
    </td>
...
Выводит в ячейке с итогом Nan (not a number). Если в XML вместо запятых в числах ставлю точки, то все работает правильно, а с запятыми проблема.((

В инете полазил, нашел следующее:
"При форматировании числа парсер ВСЕГДА полагает, что разделитель - точка. Поэтому, если у вас запятая, перед форматированием и преобразованием в число, например, функцией number(), замените запятую на точку через функцию замены в строке. Потом в number() и далее форматируйте..."

ОК,делаю как говорят:
Код: plaintext
<xsl:value-of select="format-number(number(sum(translate($XML/NewDataSet/Table/SUMM_INSIDE,',','.'))), '#####0,00', 'format1')"/>

Но теперь ошибка :
Код: plaintext
Description: The value is not a node-set

Помогите, кто может. Как из строки получить node-set или , может, другой подход есть.
...
Рейтинг: 0 / 0
Проблема с форматом числа
    #35592351
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexvmkУ меня есть древовидное двухуровневое XML с десятичными числами, разделяющие целую и дробную часть запятой.
Ужас. Кто же Вас этому научил? Вы стандарты W3C читали?
AlexvmkИзначально делал так:
Код: plaintext
1.
2.
3.
4.
<xsl:decimal-format name="format1" grouping-separator=" " decimal-separator=","/>
Выводит в ячейке с итогом Nan (not a number). Если в XML вместо запятых в числах ставлю точки, то все работает правильно, а с запятыми проблема.(([/quot]
Логично. <xsl:decimal-format /> устанавливает выходной формат чисел, а не входной
ОК,делаю как говорят:
[quot Alexvmk][src]<xsl:value-of select="format-number(number(sum(translate($XML/NewDataSet/Table/SUMM_INSIDE,',','.'))), '#####0,00', 'format1')"/>
Но теперь ошибка :
Код: plaintext
Description: The value is not a node-set

И опять логично. Одну ошибку Вы исправили, но она то была не одна
AlexvmkКак из строки получить node-set или , может, другой подход есть.
Вообще говоря во многих парсерах есть функция node-set(), но иногда можно обойтись без нее.
Покажите, как Вы формируете переменную $XML
...
Рейтинг: 0 / 0
Проблема с форматом числа
    #35592354
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexvmkУ меня есть древовидное двухуровневое XML с десятичными числами, разделяющие целую и дробную часть запятой.
Ужас. Кто же Вас этому научил? Вы стандарты W3C читали?
AlexvmkИзначально делал так:
Код: plaintext
<xsl:decimal-format name="format1" grouping-separator=" " decimal-separator=","/>
Выводит в ячейке с итогом Nan (not a number). Если в XML вместо запятых в числах ставлю точки, то все работает правильно, а с запятыми проблема.((
Логично. <xsl:decimal-format /> устанавливает выходной формат чисел, а не входной
ОК,делаю как говорят:
Alexvmk
Код: plaintext
<xsl:value-of select="format-number(number(sum(translate($XML/NewDataSet/Table/SUMM_INSIDE,',','.'))), '#####0,00', 'format1')"/>
Но теперь ошибка :
Код: plaintext
Description: The value is not a node-set

И опять логично. Одну ошибку Вы исправили, но она то была не одна
AlexvmkКак из строки получить node-set или , может, другой подход есть.
Вообще говоря во многих парсерах есть функция node-set(), но иногда можно обойтись без нее.
Покажите, как Вы формируете переменную $XML
...
Рейтинг: 0 / 0
Проблема с форматом числа
    #35592634
Alexvmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_, спасибо за ответ.

_Vasilisk_Покажите, как Вы формируете переменную $XML

Код: plaintext
<xsl:variable name="XML" select="/"/>
...
Рейтинг: 0 / 0
Проблема с форматом числа
    #35594415
Alexvmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решений ни у кого не появилось?
...
Рейтинг: 0 / 0
Проблема с форматом числа
    #35594665
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexvmk_Vasilisk_Покажите, как Вы формируете переменную $XML
Код: plaintext
<xsl:variable name="XML" select="/"/>

Тогда зачем Вы заморачиваетесь с переменной?

И даже, если Вы заморачиваетесь именно так, то все должно работать. В $XML уже находится дерево

Покажите минимальный XML и минимальную XSL, на которых проявляется ошибка
...
Рейтинг: 0 / 0
Проблема с форматом числа
    #35595159
Alexvmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имею XML:
<NewDataSet>
<Table>
<STN_NAME>Клявлино КП</STN_NAME>
<PERIOD>Рейсы до 05.10.2008</PERIOD>
<SUMM_INSIDE>114,9</SUMM_INSIDE>
</Table>
<Table>
<STN_NAME>Клявлино КП</STN_NAME>
<PERIOD>Рейсы до 05.10.2008</PERIOD>
<SUMM_INSIDE>156,7</SUMM_INSIDE>
</Table>
</NewDataSet>
Испрльзую transformer Saxon-B 9.0.0.6.
а) XSL такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:variable name="XML" select="/"/>
    <xsl:decimal-format name="format1" grouping-separator=" " decimal-separator=","/>
    <xsl:template match="/">
        <html>
            <body>
             <table border="1" cellspacing="0">
              <tfoot>
                <tr>
                  <td align="center" colspan="2">
                     <xsl:text>Итого:</xsl:text>
                  </td>
                <td align="right">
                      <xsl:value-of select="format-number(number(sum($XML/NewDataSet/Table/SUMM_INSIDE)), '#####0,00', 'format1')"/>
                </td>
              </tfoot>
              <tbody>
                  ...
              </tbody>
             </table>
            </body>
        </html>
    </xsl:template> 
</xsl:stylesheet>
пишет ошибку на линии, где <xsl:value-of select="format-number(..:
Код: plaintext
1.
Description: Cannot convert string "114,9" to a double
URL: http://www.w3.org/TR/ 2005 /WD-xpath-functions- 20050211 /#ERRFORG0001

б) XSL такой же, только изменена строка с суммированием:
Код: plaintext
 <xsl:value-of select="format-number(number(sum(translate($XML/NewDataSet/Table/SUMM_INSIDE,',','.'))), '#####0,00', 'format1')"/>
пишет ошибку на линии, где <xsl:value-of select="format-number(..:
Код: plaintext
1.
Description: A sequence of more than one item is not allowed as the first argument of translate() ("-114,9", "264,4", ...) 
URL: http://www.w3.org/TR/xpath20/#ERRXPTY0004

логично, так как translate не может принимать сразу набор аргументов.



Подкиньте плиз идейку, че то никак решение не найду...
...
Рейтинг: 0 / 0
Проблема с форматом числа
    #35595496
Alexvmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неужели с такой распространенной проблемой никто не сталкивался?!?!?
...
Рейтинг: 0 / 0
Проблема с форматом числа
    #35597097
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Общая идея понятна.
Вопрос 1. Откуда такое желание использовать запятую в качестве разделителя?
Вопрос 2. Вы пишите
Код: plaintext
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
версия 2.0 это осознаный выбор или по недомыслию? Если осознаный, то попробуйте посмотреть в сторону <xsl:function>
Далее - есть такое расширение стандарта как node-set() Saxon ее поддерживает? Если да, то вот Вам код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<xsl:variable name="data">
  <xsl:apply-templates select="/NewDataSet/Table/SUMM_INSIDE" mode="translate"/>
</xsl:variable>
<xsl:value-of select="format-number(sum($data), '#####0,00', 'format1')"/>
..............
<xsl:template match="*" mode="translate">
  <xsl:value-of select="translate(., ',', '.')"/>
</xsl:template>

Ну и самое последнее - есть золотое правило, то, что нельзя сделать при помощи XSL преобразования, можно сделать при помощи двух XSL преобразований.

Т.е. можно вначале заменить все запятые на точки, а потом уже работать с документами.

Но Вы все-таки ответьте на первый вопрос

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Проблема с форматом числа
    #35598843
Alexvmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил с точками работать. я из Oracle данные беру. Там настройки поменял.


Большое спасибо за помощь.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Проблема с форматом числа
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]