как правильно тестировать XS: decimal в XSL?
Я пытаюсь отображать различную информацию в зависимости от входящих данных. Если это целое число, я хочу отобразить только число, если это десятичное число, я хочу использовать шаблон 0.00#. Да, я знаю, немного запутался, но это спецификация разработки. :>
У меня есть следующий XSL для этого конкретного раздела, но я не вижу, чтобы пройти xsl:когда сообщение об ошибке
" ожидаемый конец выражения, найдено 'Цам'. номер (SAVG) -->castable
<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">&lt;</xsl:text>1
</xsl:when>
<xsl:otherwise>N/A</xsl:otherwise>
</xsl:choose>
Я пробовал искать / ковырять ответы, и я пробовал "экземпляр", я пробовал использовать xsl:if и т. д., Но я не могу заставить это работать. Любая помощь будет очень признательна.
спасибо.
из комментариев:
Да, мы используем 1.0. Прости, я ... новое в обработке XSL, как я могу склейте XSL и вход для генерации HTML-код?
2 ответов
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', '
')
else if($num instance of xs:decimal)
then ($num, ' is xs:decimal', '
')
else ($num, ' is something else', '
')
"/>
</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.###'), '
')
else if($num instance of xs:decimal)
then (format-number($num, '###,###,##0.00#'), '
')
else ()
"/>
</xsl:template>
</xsl:stylesheet>
производит:
3
3.14
эта таблица стилей 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><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>
</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>
выход:
<1
12,131
123.565
N/A
N/A
N/A
редактировать 3: лучший порядок тестирования (плюс выражение Дмитрия), лучший тестовый случай, более близкий входной образец к вопрошающему.