2012-03-15 2 views
0

У меня есть простая проблема. Я рассчитываю последнюю версию из списка изменений.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())" /> 

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

ответ

4

Есть три вещи, чтобы рассмотреть следующие вопросы:

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

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

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

Или:

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

в чем разница между хз: десятичный и хз: двойной – Jayy

+0

также Кажется, нет никакой разницы между числом (.) и xs: decimal (.). Когда я запускаю число (3.1) в песочнице xpath, он возвращает 3.1 в качестве результата и тот же результат с десятичным(). – Jayy

+0

За разницу между десятичным и двойным, см. Другие ответы StackOverflow, например [этот] (http://stackoverflow.com/questions/618535/what-is-the-difference-between-decimal-float-and-double- в-с). – ebruchez

1

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

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

Смежные вопросы