У меня возникла проблема, когда значение переменной $ current пришло как «6E144270003», и оно не удалось в процессоре Saxon 2.0 с ошибкой «Ошибка приведения, недопустимое лексическое значение - xs: double».
Я не могу воспроизвести эту проблему.
Это преобразование :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="current" select="'6E144270003'"/>
<xsl:template match="/">
<xsl:if test="number($current) = number($current)">
<xsl:value-of select="$current"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
при запуске с SAXON 9.0.0.4,производит :
6E144270003
Я не уверен, почему это произошло, когда это не число, а также как его исправить.По сути, если это не число, я не хочу его выводить
Строка "6E144270003"
может использоваться в качестве числа в XPath 2.0 потому что в XPath 2.0 так называемая * научная запись` является допустимым способом представления числа.
Это один интересный пример, в котором поведение XSLT 1.0 и XSLT 2.0 отличается.
ОБНОВЛЕНИЕ : ОП указал, что ему нужен тест, который оценивает false()
, если строка содержит что-либо, кроме цифр.
Этого можно добиться наилучшим образом с помощью регулярного выражения или даже:
translate($s, '0123456789', '') eq ''
ОБНОВЛЕНИЕ2 : ОП снова изменил свой вопрос !!!
Для последнего вопроса ответ здесь:
Используйте :
$s castable as xs:decimal
Это преобразование демонстрирует правильность этого метода:
<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 $s in ('1234567890',
'123.45',
'123.5',
'-123.45',
'6E144270003'
)
return
if($s castable as xs:decimal)
then $s
else ()
"/>
</xsl:template>
</xsl:stylesheet>
, когда это преобразование применяется к любому XMLдокумент (не используется), правильный результат выдается :
1234567890 123.45 123.5 -123.45