XSLT: числовой формат - PullRequest
       0

XSLT: числовой формат

1 голос
/ 31 января 2011

В XSL есть функция, подобная CONTAIN, что если у меня есть номер с символом «123112 '+:», то он его не принимает.* ответ:

111111
222222

Я застрял с версией xslt 1.0

Ответы [ 3 ]

0 голосов
/ 31 января 2011

Другой подход, использующий число в логическое преобразование.

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

    <xsl:template match="/*">
        <xsl:apply-templates select="Number[boolean(number()) or . = 0]"/>
    </xsl:template>

    <xsl:template match="Number">
        <xsl:value-of select="."/>
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>

</xsl:stylesheet>

С вводом:

<Numbers>
    <Number>111111</Number>
    <Number>123123+</Number>
    <Number>222222</Number>
    <Number>222222+</Number>
</Numbers>

Правильный результат:

111111
222222

Цитирование спецификации:

Булева функция преобразует свой аргумент в логическое значение следующим образом: число истинно тогда и только тогда, когда оно не является ни положительным, ни отрицательным нулем, ни NaN

0 голосов
/ 31 января 2011

Еще одно решение:)

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="Number[not(.*.+1)]"/>
</xsl:stylesheet>

, когда это преобразование применяется к следующему документу XML :

<t>
    <Number>111111</Number>
    <Number>123123+</Number>
    <Number>222222</Number>
    <Number>222222+</Number>
</t>

желаемый, правильный результат получается :

<t>
  <Number>111111</Number>
  <Number>222222</Number>
</t>

Пояснение : Все Number элементов для которых выражение:

not(.*.+1)

являетсяtrue() отфильтровываются по простому правилу шаблона:

 <xsl:template match="Number[not(.*.+1)]"/>

Это возможно, только если строковое значение элемента Number не может быть преобразовано в число.В этом случае .*.+1 оценивается как NaN, а boolean(NaN) по определению false().

Если строковое значение элемента Number можно преобразовать в число $ num, тогда приведенное вышеВыражение эквивалентно:

not($num*$num+1)

и $num*$num+1 >= 1 для любого числа $num, поэтому boolean(.*.+1) в этом случае всегда равно true().

0 голосов
/ 31 января 2011

Используйте следующую XPath, чтобы выбрать все узлы, которые содержат числа.Это пропустит те, у которых есть знак плюс.

Number[number(.)=number(.)]

Должно работать с XSLT 1.0

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