Как заставить XSLT перестать использовать научную нотацию при выводе результатов числовых операций? - PullRequest
3 голосов
/ 07 января 2010

У меня есть немного XSLT, который выполняет магию с целочисленными идентификаторами базы данных. Соответствующий фрагмент кода

      <xsl:variable name="releaseId" select="@ID + $contentOffsetId"/>
      <xsl:attribute name="OLD_ID"> <xsl:value-of select="@ID" /> </xsl:attribute>
      <xsl:attribute name="RELEASE_ID"> <xsl:value-of select="$releaseId" />      

К сожалению, результат этого выглядит следующим образом:

<ALBUM.RELEASE_LOCALE LOCALE_CODE="en_US" OLD_ID="6597512" RELEASE_ID="6.597513E6">

Этот результат для меня бесполезен, так как я не смогу использовать научную запись в качестве входных данных для моей утилиты импорта БД. Я пробовал несколько функций в объявлении переменной, таких как string(@ID + $contentOffsetId), но, похоже, ничего не дает желаемых результатов.

XSL выполняется с использованием Saxon 8.7.

Ответы [ 2 ]

7 голосов
/ 07 января 2010

Используйте формат-номер (для подробной информации: здесь )

0 голосов
/ 26 июля 2018

Я подозреваю, что @ID и $contentOffsetId оба являются целыми числами, маскирующимися как двойные, и лучшей стратегией будет использование целочисленной арифметики для их добавления, а не арифметики с плавающей точкой. Преобразование в строку будет затем использовать правила для целых чисел, а не правила для двойных чисел, что позволит избежать использования научной нотации.

Вы не показали нам, откуда взято $contentOffsetId, но если мое предположение верно, объявите его как целое число, используя as="xs:integer" в объявлении переменной.

Что касается @ID, я предполагаю, что ваша таблица стилей не поддерживает схемы и, следовательно, @ID является нетипизированной атомарной; Вы можете преобразовать его в целое число, используя xs:integer(@ID). По умолчанию, когда нетипизированные атомарные значения используются в арифметических выражениях, это преобразование в xs:double, но это во многом наследие XSLT 1.0 и часто неуместно.

Кстати, в XSLT 2.0 вы можете заменить

<xsl:attribute name="x"><xsl:value-of select="Y"/></xsl:attribute>

от

<xsl:attribute name="x" select="Y"/>
...