Строка форматирования (удаление ведущих нулей)

Я новичок в xslt. Мое требование - преобразовать xml файл в текстовый файл в соответствии с бизнес-спецификациями. Я столкнулся с проблемой с одной из проблем форматирования строк. Пожалуйста, помогите мне, если у вас есть идеи.

Вот часть входных данных xml:   "0001295"

Ожидаемый результат для печати в текстовый файл: +1295

Моя основная проблема - удалить ведущие нули. Пожалуйста, поделитесь, если у вас есть какая-либо логика/функция.

Ответ 1

Просто используйте это простое выражение:

number(.)

Вот полный пример:

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

 <xsl:template match="t">
      <xsl:value-of select="number(.)"/>
 </xsl:template>
</xsl:stylesheet>

При применении к этому XML-документу:

<t>0001295</t>

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

1295

II. Используйте format-number()

format-number(., '#')

Ответ 2

Есть несколько способов сделать это. Если значение полностью числовое (например, не CSV-строка или часть кода продукта, такого как ASN0012345), вы можете преобразовать из строки в число и обратно в строку снова:

string(number($value)).

В противном случае просто замените 0 в начале:

replace( $value, '^0*', '' )

Требуется '^' (стандартный синтаксис regexp), или значение 001201 будет заменено на 121 (все нулевые удалены).

Надеюсь, что это поможет. Dave

Ответ 3

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

Сначала найдите первый ненулевой элемент, удалив все нулевые элементы, находящиеся в настоящее время в значении

<xsl:variable name="first" select="substring(translate(., '0', ''), 1, 1)" />

Затем вы можете найти подстроку перед этим первым символом, а затем использовать substring-after, чтобы получить ненулевую часть после этого

<xsl:value-of select="substring-after(., substring-before(., $first))" />

Или, чтобы объединить два оператора в один

<xsl:value-of select="substring-after(., substring-before(., substring(translate(., '0', ''), 1, 1)))" />

Итак, учитывая следующий ввод

<a>00012095Kb</a>

Затем, используя следующий XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/a">
      <xsl:value-of select="substring-after(., substring-before(., substring(translate(., '0', ''), 1, 1)))" />
   </xsl:template>
</xsl:stylesheet>

Будет выведено следующее:

12095Kb

Ответ 4

Вы можете использовать рекурсивный шаблон, который удалит ведущие нули:

<xsl:template name="remove-leading-zeros">
    <xsl:param name="text"/>
    <xsl:choose>
        <xsl:when test="starts-with($text,'0')">
            <xsl:call-template name="remove-leading-zeros">
                <xsl:with-param name="text"
                    select="substring-after($text,'0')"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$text"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

Вызвать это следующим образом:

 <xsl:call-template name="remove-leading-zeros">
        <xsl:with-param name="text" select="/path/to/node/with/leading/zeros"/>
    </xsl:call-template>
</xsl:template>

Ответ 5

Как простая альтернатива в XSLT 2.0, которая может использоваться с цифровым или буквенно-цифровым вводом, с или без ведущих нулей, вы можете попробовать:

replace( $value, '^0*(..*)', '$1' )

Это работает, потому что ^0* является жадным, а (..*) захватывает остальную часть ввода после последнего начального нуля. $1 относится к захваченной группе.

Обратите внимание, что вход, содержащий только нули, выведет 0.

Ответ 6

<xsl:value-of select="number(.) * 1"/>

работает для меня

Ответ 7

Весь анализатор XSLT1, как популярный модуль libXML2 для XSLT, имеет зарегистрированным функциям функции...... Таким образом, мы можем предположить его использование. Предположим также, что язык, который вызывает XSLT, является PHP: см. этот wikibook о registerPHPFunctions.


Встроенная функция PHP ltrim может использоваться в

  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
       xmlns:fn="http://php.net/xsl">
   <xsl:output method="xml" encoding="utf-8" indent="yes"/>
   <xsl:template match="test">
       show <xsl:value-of select="fn:function('ltrim',string(.),'0')" />",
   </xsl:template>
  </xsl:stylesheet>

Теперь представьте себе немного более сложную проблему, до ltrim строку с более чем 1 номером, например. hello 002 and 021, bye.

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

function ltrim0_Multi($s) {
    return preg_replace('/(^0+|(?<= )0+)(?=[1-9])/','',$s);
} 

преобразует пример в hello 2 and 21, bye.

Ответ 8

XSLT 2.0 Удалите начальные нули из STRING

<xsl:value-of select="replace( $value, '^0+', '')"/>