xforms:decimal для отображения только одного значения точности

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

        <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())" />

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


person Jayy    schedule 15.03.2012    source источник


Ответы (2)


Есть три вещи, которые следует учитывать:

  • с какими типами значений вы работаете
  • в каком формате хранится значение в 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')"/>

Or:

<xforms:output value="format-number(instance('history')/latestVersion, '#,###.0')"/>
person ebruchez    schedule 15.03.2012
comment
В чем разница между xs:decimal и xs:double - person Jayy; 05.11.2012
comment
Также кажется, что нет разницы между number(.) и xs:decimal(.). Когда я запускаю номер (3.1) в песочнице xpath, он возвращает 3.1 в качестве результата и тот же результат с десятичным числом (). - person Jayy; 05.11.2012
comment
Разницу между десятичным и двойным числом см. в других ответах StackOverflow, например этот. - person ebruchez; 05.11.2012

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

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

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

person grtjn    schedule 15.03.2012