Как разбить текст по переводу строки и объединить с переменным отступом - PullRequest
0 голосов
/ 10 августа 2011

Привет, здесь, ниже, я показал, что в моем xml существует значение, похожее на трехстрочный перевод, но сомнения в том, как извлечь значение на основе перевода строки в логике xslt, могут мне помочь

     <message>
    <block4>
         <tag>
    <name>57D</name>
    <value>BVALESM M0746A
           051028GB ES00069074
           6A051028 GBES00069</value>
         </tag>
    </block4>
</message>

вот мой xslt, которыйесли бы я пытался, но все же некоторые проблемы, пожалуйста, предложите мне

<xsl:when test="tag[name = '57D'] ">
                    <xsl:variable name="l" select="substring-before(tag[name = '57D']/value, '&#13;')"/>
                    <xsl:variable name="r" select="substring-after(substring-before(tag[name = '57D']/value, '&#13;'), '&#13;')"/>


                    <xsl:value-of select="concat(substring(concat($l,'                                   '),1,35),substring(concat($r,'                                   '),1,35))"/>

                </xsl:when>

генерации вывода в виде:

BVALESM M0746A 051028GB ES000690746A051028 GBES00069

это былоучитывая итоговое значение после первого clrf, чтобы он не проверял логику

требуемый вывод, такой как

BVALESM M0746A                     051028GB ES00069074                6A051028 GBES00069

каждая строка макс должна быть 35, это был не каждый раз, когда данные должны приходить как 35 длякаждый, так что если нет, значит, нам нужно вставить пробел

Ответы [ 2 ]

1 голос
/ 10 августа 2011

Хорошо, фактический вопрос сильно изменился в требованиях с момента его первоначальной формулировки.Теперь я предоставлю новый ответ.

Следующее преобразование ведет себя следующим образом:

  • Разделение строк по переводу строки (с использованием шаблона split-string )
  • Для каждой строки проверьте 35 против длины строки.Если строка меньше 35, добавляется заполнение, чтобы заполнить строку до 35 (используя заполнение шаблон)
  • Все строки объединяются

[XSLT 1.0]

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

    <xsl:template match="message/block4/tag">
        <xsl:variable name="result">
            <xsl:call-template name="split-string">
                <xsl:with-param name="string" select="value"/>
            </xsl:call-template>
        </xsl:variable>

        <xsl:value-of select="$result"/>

    </xsl:template>

    <xsl:template name="split-string">
        <xsl:param name="string"/> 
        <xsl:variable name="l" select="substring-before($string, '&#xA;')"/> 
        <xsl:variable name="r" select="substring-after($string, '&#xA;')"/>

        <xsl:choose>
            <xsl:when test="$l">
                <xsl:variable name="spaces">
                    <xsl:call-template name="padding">
                        <xsl:with-param name="times" 
                            select="35 - string-length(normalize-space($l))"/>
                    </xsl:call-template>
                </xsl:variable>
                <xsl:value-of select="concat(normalize-space($l),$spaces)" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="normalize-space($string)" />
            </xsl:otherwise>
        </xsl:choose>

        <xsl:if test="$r">
            <xsl:call-template name="split-string">
                <xsl:with-param name="string" select="$r" /> 
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

    <xsl:template name="padding">
        <xsl:param name="times" select="0"/>
        <xsl:param name="spaces" select="''"/>
        <xsl:choose>
            <xsl:when   test="$times>0">
                <xsl:call-template name="padding">
                    <xsl:with-param name="times" select="$times - 1"/>
                    <xsl:with-param name="spaces" select="concat($spaces,' ')"/>    
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$spaces"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>

При применении к следующему входу:

<message>
    <block4>
        <tag>
            <name>57D</name>
            <value>BVALESM M0746A
                051028GB ES00069074
                6A051028 GBES00069</value>
        </tag>
    </block4>
</message>

Этот выходной сигнал получается:

BVALESM M0746A                     051028GB ES00069074                6A051028 GBES00069
0 голосов
/ 10 августа 2011

есть некоторые опции, но они сильно зависят от других ограничений, в основном связанных с вашим процессором xslt и его средой выполнения:

  • вы можете использовать xslt 2.0 или вам нужно придерживаться xslt 1.0?
  • функции exslt могут быть полезны: http://exslt.org/str/index.html
  • вы также можете обрабатывать данные, рекурсивно вызывая именованный шаблон данных, и использовать функции xpath substring-before, substring-after - youвероятно, потребуется также normalize-space, чтобы иметь постоянный разделитель пробелов - см. http://www.w3.org/TR/xpath-functions/ для деталей
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...