Добавьте ведущий ноль к числам между специальными тегами - PullRequest
0 голосов
/ 18 февраля 2020

Я знаю, что не сложно добавить ведущий ноль к числам. Однако я ищу оптимальное решение для добавления начального нуля только к значениям от <SpecialTag>0</SpecialTag> до 5 цифр.

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<Root>
    <Row>
        <Tag1>0</Tag1>
        <SpecialTag>0</SpecialTag>
        <Tag2>0</Tag2>
    </Row>
    <Row>
        <Tag1>0</Tag1>
        <SpecialTag>12</SpecialTag>
        <Tag2>0</Tag2>
    </Row>
    <Row>
        <Tag1>0</Tag1>
        <SpecialTag>12345</SpecialTag>
        <Tag2>0</Tag2>
    </Row>
    <Row>
        <Tag1>0</Tag1>
        <SpecialTag>1234</SpecialTag>
        <Tag2>0</Tag2>
    </Row>
</Root>

Ожидаемые результаты должны быть такими, как показано ниже:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<Root>
    <Row>
        <Tag1>0</Tag1>
        <SpecialTag>00000</SpecialTag>
        <Tag2>0</Tag2>
    </Row>
    <Row>
        <Tag1>0</Tag1>
        <SpecialTag>00012</SpecialTag>
        <Tag2>0</Tag2>
    </Row>
    <Row>
        <Tag1>0</Tag1>
        <SpecialTag>12345</SpecialTag>
        <Tag2>0</Tag2>
    </Row>
    <Row>
        <Tag1>0</Tag1>
        <SpecialTag>01234</SpecialTag>
        <Tag2>0</Tag2>
    </Row>
</Root>

1 Ответ

4 голосов
/ 18 февраля 2020

Использование xsltpro c ( Предлагаемое решение! ):

Наличие файла XLST transform.xsl:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

    <!-- Matches the SpecialTag -->
    <xsl:template match="SpecialTag">
        <xsl:copy>
            <!-- The number is available using node() and format-number() applies the 0-padding -->
            <xsl:value-of select="format-number(node(), '00000')" />
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

Запустите при условии, что input.xml содержит ваши XML:

$ xsltproc transform.xml input.xml

Небезопасные решения:

Они основаны на том факте, что открывающий тег <SpecialTag> и закрывающий тег </SpecialTag> включены та же самая строка и что в каждой строке есть только один из них.

Ниже приведены решения только , поскольку автор явно пометил вопрос с помощью / / . Это не подходящие инструменты для достижения этой цели !

Все они работают с регулярными выражениями для перехвата <SpecialTag>, за которыми следуют несколько чисел, затем </SpecialTag> и преобразование чисел, перехваченных с помощью Версия этих чисел с добавлением 0.

Использование sed :

sed --regexp-extended 's@<SpecialTag>([0-9]+)</SpecialTag>@<SpecialTag>0000000\1</SpecialTag>@;s@0*([0-9]{5,})@\1@'

Использование perl:

perl -pe 's@<SpecialTag>([0-9]+)</SpecialTag>@sprintf("<SpecialTag>%05d</SpecialTag>",$1)@e'

Использование awk :

awk '{gsub( /<SpecialTag>[0-9]+<\/SpecialTag>/, sprintf("<SpecialTag>%05d</SpecialTag>", gensub(/[^0-9]/, "","g"))); print}'
...