Как правильно проверить XSL: десятичный в XSL - PullRequest
6 голосов
/ 29 сентября 2010

Я пытаюсь отобразить различную информацию в зависимости от входящих данных. Если это целое число, я хочу отобразить только число, если это десятичное число, я хочу использовать шаблон 0,00 #. Да, я знаю, немного перепутал, но это спецификация развития. :>

У меня есть следующий XSL для этого конкретного раздела, но я не вижу, чтобы пройти xsl: когда сообщение об ошибке

"Найден ожидаемый конец выражения «Колдовать». номер (SAVG) -> литейный <- как xs: десятичное число "</p>

<xsl:choose>
    <xsl:when test="number(SAVG) > 0">
        <xsl:choose>
            <xsl:when test="number(SAVG) castable as xs:decimal">
                <xsl:value-of select="format-number(SAVG, '###,###,##0.00#')"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="format-number(SAVG, '###,###,##0.###')"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:when>
    <xsl:when test="number(SAVG) = 0">
        <xsl:text disable-output-escaping="yes">&amp;lt;</xsl:text>1
    </xsl:when>
    <xsl:otherwise>N/A</xsl:otherwise>
</xsl:choose>

Я пытался искать / ковыряться в поисках ответов, и я пробовал «экземпляр», я пытался использовать xsl: if и т. Д., Но я не могу заставить это работать. Любая помощь будет принята с благодарностью.

Спасибо.

Из комментариев:

Да, мы используем 1.0. Извини я новичок в обработке XSL, как мне склейте свой XSL и вход для генерации HTML?

Ответы [ 2 ]

6 голосов
/ 29 сентября 2010

I. XSLT 1.0 :

В модели данных XPath 1.0, используемой XSLT 1.0, отсутствуют xs: integer и xs: decimal.

Вот фрагмент кода, который вы можете использовать :

    <xsl:choose> 
        <xsl:when test="not(floor(SAVG) = SAVG)"> 
            <xsl:value-of select="format-number(SAVG, '###,###,##0.00#')"/> 
        </xsl:when> 
        <xsl:otherwise> <!-- Integer value -->
            <xsl:value-of select="SAVG"/> 
        </xsl:otherwise> 
    </xsl:choose> 

Примечание. : Чтобы проверить, является ли числовое значение целым числом, мы используем следующий тест:

 floor($someNum) = $someNum

Вот один из способов сделать это:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output method="text"/>

 <xsl:template match="/">
  <xsl:sequence select=
   "for $num in (3, 3.14)
     return
       if($num instance of xs:integer)
         then ($num, ' is xs:integer', '&#xA;')
         else if($num instance of xs:decimal)
           then ($num, ' is xs:decimal', '&#xA;')
           else ($num, ' is something else', '&#xA;')
   "/>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к любому XML-документу (не используется), получается требуемый, правильный результат :

3  is xs:integer 
3.14  is xs:decimal 

Или, используя функцию format-number() согласно вашему примеру :

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output method="text"/>

 <xsl:template match="/">
  <xsl:sequence select=
   "for $num in (3, 3.14)
     return
       if($num instance of xs:integer)
         then (format-number($num, '###,###,##0.###'), '&#xA;')
         else if($num instance of xs:decimal)
           then (format-number($num, '###,###,##0.00#'), '&#xA;')
           else ()
   "/>
 </xsl:template>
</xsl:stylesheet>

производит

3 
3.14 
0 голосов
/ 29 сентября 2010

Эта таблица стилей XSLT 1.0:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="test">
        <xsl:choose>
            <!-- Not number or number less than zero -->
            <xsl:when test="0 > SVGA or number(SVGA) != SVGA">
                <xsl:text>N/A</xsl:text>
            </xsl:when>
            <!-- Number zero -->
            <xsl:when test="SVGA = 0">
                <xsl:text>&lt;1</xsl:text>
            </xsl:when>
            <!-- Integer number -->
            <xsl:when test="floor(SVGA) = SVGA">
                <xsl:value-of select="format-number(SVGA,'###,###,##0.###')"/>
            </xsl:when>
            <!-- Double number -->
            <xsl:otherwise>
                <xsl:value-of select="format-number(SVGA,'###,###,##0.00#')"/>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<root>
    <test>
        <SVGA>0</SVGA>
    </test>
    <test>
        <SVGA>12131</SVGA>
    </test>
    <test>
        <SVGA>123.5654</SVGA>
    </test>
    <test>
        <SVGA>-12.1</SVGA>
    </test>
    <test>
        <SVGA>-7528</SVGA>
    </test>
    <test>
        <SVGA>zero</SVGA>
    </test>
</root>

Вывод:

&lt;1
12,131
123.565
N/A
N/A
N/A

Редактировать 3 :Лучший порядок тестирования (плюс выражение Димитра), лучший тестовый пример, более близкая входная выборка к спрашивающему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...