Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Размер строки


Автор: Mozirina 24.10.2011, 13:29
Привет всем!

Как написать XSLT преобразование, чтобы при слиянии двух наборов цифр общее количество было не более 13 символов? При этом первое, например 30000, второе меняющиеся значения (артикул) / Их первого можно и нужно удалят лишние нули, артикул оставляем в неизменном виде.

Заранее спасибо 

Автор: diadiavova 24.10.2011, 14:33
Используй функции string-length, substring и concat
http://msdn.microsoft.com/ru-ru/library/ms256180%28VS.90%29.aspx

Автор: Mozirina 24.10.2011, 14:36
Цитата(diadiavova @ 24.10.2011,  14:33)
Используй функции string-length, substring и concat
http://msdn.microsoft.com/ru-ru/library/ms256180%28VS.90%29.aspx

уже пыталась..не выходит....не понимаю как именно условие задать если так, то столько нулей, если так, то столько....

Автор: diadiavova 24.10.2011, 14:46
А что именно не выходит? smile Определяешь количество символов в артикуле, вычитаешь его из 13 и результат используешь в функции substring для указания количества символов первой строки, которое надо взять. Что-то типа
Код

concat(
    substring(
        $firstnumber,
        1,
        13 - string-length($articul)
        ), 
    $articul
    )

Переносы и инденты вставил для пущей ясности. Накидал без проверки, так что не факт, что заработает сразу, но идея должна быть понятна.

Автор: Mozirina 24.10.2011, 14:52
Цитата(diadiavova @ 24.10.2011,  14:46)
А что именно не выходит? smile Определяешь количество символов в артикуле, вычитаешь его из 13 и результат используешь в функции substring для указания количества символов первой строки, которое надо взять. Что-то типа
Код

concat(
    substring(
        $firstnumber,
        1,
        13 - string-length($articul)
        ), 
    $articul
    )

Переносы и инденты вставил для пущей ясности. Накидал без проверки, так что не факт, что заработает сразу, но идея должна быть понятна.

Спасибо, буду дальше пытаться....я еще новичок-с

Автор: magelan 24.10.2011, 14:57
Я так понимаю, что там только XPath недостаточно. Нужна рекурсия.
Код

<?xml version="1.0" encoding="windows-1251"?>

<root>
    <item number="1234567890" /> 
    <item number="123456789" /> 
    <item number="12345678" /> 
    <item number="1234567" /> 
    <item number="123456" /> 
</root>

Код

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

<xsl:template match="/">
    <xsl:for-each select="/root/item">
        <xsl:variable name="art">
            <xsl:choose>
                <xsl:when test="string-length( @number ) &gt; 12">
                    <xsl:text>Error - </xsl:text>
                    <xsl:value-of select="@number" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:text>3</xsl:text>
                    <xsl:call-template name="dup0">
                        <xsl:with-param name="count" select="12 - string-length( @number )" />
                    </xsl:call-template>
                    <xsl:value-of select="@number" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:value-of select="$art" />
        <br />
    </xsl:for-each>
</xsl:template>
<xsl:template name="dup0">
    <xsl:param name="count" select="0" />
    
    <xsl:if test="$count &gt; 0">
        <xsl:text>0</xsl:text>
        <xsl:call-template name="dup0">
            <xsl:with-param name="count" select="$count - 1" />
        </xsl:call-template>
    </xsl:if>    
</xsl:template>
</xsl:stylesheet>


Хотя способ ДядиВовы - много изящнее...

Автор: diadiavova 24.10.2011, 15:03
Цитата(magelan @  24.10.2011,  15:57 Найти цитируемый пост)
Я так понимаю, что там только XPath недостаточно. Нужна рекурсия.

Ну почему? Если заранее известно, что первое число соответствует определенному форумату, то есть у него в конце присутствуют нули, которые при необходимости можно удалить, то вполне достаточно. Вот если это условие проверять надо - тогда конечно, но в условии вроде как это не было описано.

Автор: Mozirina 24.10.2011, 15:09
верно, нули у первых чисел изначально заданы, неизменны.... Нужны лишь для "дела", поскольку поле штрих-кода содержит 13 значений, а в артикуле из которого оно получается изначально меньше цифр, вот и решили добавлять некое число.. Надеюсь понятно изложила...Пошла изучать ваши советы!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)