xforms: десятичный, чтобы показать только одно значение точности - PullRequest
0 голосов
/ 15 марта 2012

У меня есть простая проблема. Я рассчитываю последнюю версию из списка ревизий.

        <xforms:instance id="history">
            <metaData>
                <latestVersion></latestVersion>
                <History>
                    <Revision>
                        <Date>01/02/2011</Date>
                        <Comments>Mino Issues Fixed</Comments>
                        <Version>0.4</Version>
                    </Revision>
                    <Revision>
                        <Date>17/02/2011</Date>
                        <Comments>Minor issues fixed</Comments>
                        <Version>2.1</Version>
                    </Revision>
                    <Revision>
                        <Date>22/03/2011</Date>
                        <Comments>Cosmetic Defects Fixed</Comments>
                        <Version>2.2</Version>
                    </Revision>
                    <Revision>
                        <Date>06/04/2011</Date>
                        <Comments>minor issues fixed</Comments>
                        <Version>2.3</Version>
                    </Revision>
                    <Revision>
                        <Date>20/04/2011</Date>
                        <Comments>minor issues fixed</Comments>
                        <Version>2.4</Version>
                    </Revision>
                    <Revision>
                        <Date>22/04/2011</Date>
                        <Comments>Small build</Comments>
                        <Version>3.0</Version>
                    </Revision>
                </History>
            </metaData>
        </xforms:instance>

        <xforms:bind nodeset="instance('history')/latestVersion" 
            type="xforms:decimal"
            calculate="max(instance('history')/History/Revision/Version/number())" />

При выводе последней версии отображается как 3.00. Если я удаляю type в определении привязки, он отображается как 3. Как я могу показать это как 3.0

Ответы [ 2 ]

4 голосов
/ 15 марта 2012

Необходимо учитывать три вещи:

  • с какими типами значений вы работаете
  • в каком формате значение, сохраненное в latestVersion, равно
  • какВы форматируете значение для представления пользователю

Во-первых, поскольку ваши номера версий являются десятичными, вы должны последовательно обрабатывать их как десятичные.Поэтому вам не следует использовать функцию number(), которая всегда возвращает xs:double.Вы должны переписать выражение следующим образом:

max(instance('history')/History/Revision/Version/xs:decimal(.))

Во-вторых, при этом значение, сохраненное в latestVersion, будет гарантированно иметь формат xs:decimal.Здесь это будет 3.

В-третьих, как вы представите это значение пользователю?Вы должны убедиться, что он отформатирован правильно.Если вы напишите:

<xforms:output ref="latestVersion"/>

xforms:output проверяет тип значения, замечает, что это тип decimal, и форматирует его в соответствии с форматом по умолчанию для десятичных типов, см. properties-xforms.xml .

Формат по умолчанию для десятичных типов:

format-number(xs:decimal(.),'###,###,###,##0.00')

Если вы хотите использовать десятичный формат, вы можете переопределить свойство в properties-local.xmlили используйте что-то вроде предложенного @grtjn:

<xforms:output value="format-number(instance('history')/latestVersion, '#.0')"/>

Или:

<xforms:output value="format-number(instance('history')/latestVersion, '#,###.0')"/>
1 голос
/ 15 марта 2012

Вы можете настроить презентацию, используя <xforms:output> с атрибутом value вместо ref или bind.Значением этого атрибута является выражение, которое может содержать вызов format-number().Например:

<xforms:output value="format-number(instance('history')/latestVersion, '#.0')"/>

Примечание: поддержка формата числа может зависеть от реализации, но я думал, что Orbeon это поддерживает.

...