Форматирование вывода функции sum () в XQuery / XSLT / XPath - PullRequest
0 голосов
/ 04 мая 2011

У меня есть вопрос о форматировании вывода функции sum() в XQuery / XSLT / XPath.У меня есть как таблица стилей XSLT, так и XQuery.Я могу получить правильное форматирование в XSLT, но не в XQuery.

Вот пример входного файла:

<userTotals>
  <user cost="138764.63" hours="1506.51"/>
  <user cost="329555.76" hours="3577.85"/>
  <user cost="213909.81" hours="2322.33"/>
  <user cost="22684.85" hours="246.28"/>
  <user cost="6147.42" hours="66.74"/>
  <user cost="1269.27" hours="13.78"/>
  <user cost="181.45" hours="1.97"/>
  <user cost="755.30" hours="8.2"/>
</userTotals>

Вот пример таблицы стилей:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/userTotals">
    <results>
      <cost><xsl:value-of select="sum(user/@cost)"/></cost>
      <hours><xsl:value-of select="sum(user/@hours)"/></hours>
      <hours-formatted>
        <xsl:value-of select="format-number(sum(user/@hours),'###.##')"/>
      </hours-formatted>
    </results>
  </xsl:template>

</xsl:stylesheet>

Вот вывод:

<results>
   <cost>713268.49</cost>
   <hours>7743.659999999999</hours>
   <hours-formatted>7743.66</hours-formatted>
</results>

Обратите внимание на вывод <hours> и <hours-formatted>.Содержимое <hours> является неизмененным / неформатированным выводом sum().Содержимое <hours-formatted> - это способ, которым я хочу, чтобы число форматировалось как в XSLT, так и в XQuery.

Проблема в том, что в XQuery format-number() недоступен.Как я могу одинаково отформатировать результаты sum() в XSLT и XQuery, чтобы результаты выглядели как <hours-formatted>?

Потребуется ли мне создать функцию, которая будет выводить sum()как строка и обработать десятичную самостоятельно?В этом случае мне нужно округлить .659 до .66.Я надеюсь, что есть лучший способ сделать это (возможно, приведите результаты к другому типу, а затем ??).

Спасибо за любую информацию / руководство, которое вы можете предоставить.

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Saxon-PE и выше предлагает format-number () в XQuery в качестве функции расширения (или путем включения поддержки XQuery 3.0).

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

1 голос
/ 04 мая 2011

Это выражение XQuery:

let $sum := string(ceiling(sum(/*/user/@hours) * 100)),
    $length := string-length($sum)
return
  concat(
     substring($sum, 1, $length - 2),
     '.',
     substring($sum, $length - 1)
  )

Выход:

7743.66
...