Строка форматирования (удаление ведущих нулей)
Я новичок в 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+', '')"/>