Форматирование строки (удаление начальных нулей) - PullRequest
13 голосов
/ 10 января 2012

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

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

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

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

Ответы [ 8 ]

22 голосов
/ 10 января 2012

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

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(., '#')
6 голосов
/ 10 января 2012

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

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

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

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

<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
5 голосов
/ 10 января 2012

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

string(number($value)).

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

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

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

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

2 голосов
/ 16 сентября 2013

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

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

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

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

2 голосов
/ 10 января 2012

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

<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>
1 голос
/ 29 сентября 2016

XSLT 2.0 Удалить ведущие нули из STRING

<xsl:value-of select="replace( $value, '^0+', '')"/>
1 голос
/ 10 сентября 2014
<xsl:value-of select="number(.) * 1"/>

у меня работает

0 голосов
/ 23 июля 2014

Все синтаксические анализаторы XSLT1, как и популярный модуль libXML2 для XSLT , имеют зарегистрированную функцию функций ... Итак, мы можем предположить ее использование.Предположим также, что языком, который вызывает XSLT, является PHP: см. эту вики-книгу о 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.

...