XSLT Номер теста - PullRequest
       9

XSLT Номер теста

0 голосов
/ 12 октября 2010

У меня возникла проблема, когда значение переменной $ current пришло как '6E144270003'.Моей первоначальной целью было просто проверить число, но «6E144270003» прошел тест number (), потому что это действительная «научная запись» (как мне было указано здесь).

Мне нужен действительныйпроверка, чтобы позволить данным, содержащим только целые числа (может включать десятичное число и знак минус), приравнять к истине, а любые другие данные приравнивать к ложным.пропуск: 123,5
должен пройти: -123,45

 <xsl:if test="number($current) = number($current)">  
    <xsl:value-of select="$current"/>   
 </xsl:if>  

1 Ответ

2 голосов
/ 12 октября 2010

У меня возникла проблема, когда значение переменной $ 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
...