Как добавить пробелы в и ограничить записи до 300 символов в xslt - PullRequest
0 голосов
/ 16 декабря 2018

Я написал xslt для преобразования xml в CSV.По сути, xslt создает записи длиной до трехсот символов и добавляет пробелы, пока запись не достигнет предела в 300, если данных нет.Ниже приведен xslt, и он служит моей цели.Но мне пришлось использовать переменную Spaces с 300 пробелами, которая используется в записи.

Мой вопрос: мне любопытно узнать, есть ли какой-нибудь более простой способ, чем подход, который я выбрал.Ниже мой xslt, где вы можете увидеть переменные пробелы.Пожалуйста, дайте мне знать, если я могу использовать любую более короткую переменную.

<xsl:output method="text"/>
<xsl:variable name="delimiter" select="'&#x20;'"/>
<xsl:variable name="linefeed" select="'&#xD;&#xA;'"/>
<xsl:variable name="spaces" select="'&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;
    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;
    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;
    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;
    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;
    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;
    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;
    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;
    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;
    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;
    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;
    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;
    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;'"/>


<xsl:template match="wd:Report_Entry/wd:Payments_group">
    <xsl:variable name="Paymentamount" select="number(translate(wd:Payment_Total_Amount,'.',''))"/>
    <xsl:variable name="Var_CheckNumber" select="format-number(wd:Check_Number, '0000000000')"/>
    <xsl:variable name="Var_Payment" select="format-number($Paymentamount, '0000000000')"/>
    <xsl:value-of select="substring(concat (wd:CF_Account_number_HSBC_Canada, $delimiter, $Var_CheckNumber, $Var_Payment,wd:Payment_Date, $delimiter, wd:Payment_Payee/@wd:Descriptor, $spaces),1,300)"/>
    <xsl:value-of select='$linefeed'/>
</xsl:template>

<xsl:template match="wd:Report_Data">
    <xsl:for-each-group select="wd:Report_Entry/wd:Payments_group" group-by="wd:CF_Account_number_HSBC_Canada">
        <xsl:apply-templates select="current-group()"/>
        <xsl:variable name="Counter" select="format-number(count(current-group()), '0000000000')"/>
        <xsl:variable name="Var_TotalSum" select="format-number(sum(current-group()/number(translate(wd:Payment_Total_Amount,'.',''))), '0000000000')"/>
        <xsl:value-of select="substring(concat ('T',wd:CF_Account_number_HSBC_Canada, $delimiter,$delimiter,$delimiter,$delimiter,$delimiter,$Counter,$delimiter,$delimiter,$delimiter,$delimiter, $Var_TotalSum, $spaces),1,300)"/>
        <xsl:value-of select='$linefeed'/>
    </xsl:for-each-group>
</xsl:template>

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Использование for-each-group предполагает использование процессора XSLT 3 или 2, поэтому для построения строки из $n пробелов можно использовать XPath 3 или 2, например, string-join((1 to $n)!' ') (также может быть выражено в XPath 3.1 как (1 to $n)!' '=>string-join()) или string-join(for $i in 1 to $n return ' ', '') в XSLT / XPath 2.

0 голосов
/ 16 декабря 2018

Рассмотрим рекурсивный шаблон, чтобы добавить необходимые пробелы для заполнения вашего текстового вывода.Поскольку вы не предоставляете воспроизводимый пример (т. Е. Оригинальный XML), рассмотрите пример ниже, который добавляет каждое текстовое значение длиной до 10 символов:

XML

<?xml version="1.0" encoding="utf-8" ?>
<root>
    <languages type="special purpose">
        <language>xslt</language>
        <language>sql</language>
        <language>css</language>
    </languages>
    <languages type="general purpose">
        <language>python</language>
        <language>java</language>
        <language>c#</language>
    </languages>
</root>

XSLT (см. Комментарии для настройки в соответствии с вашим фактическим XSLT)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
     <xsl:output method="xml" indent="yes"/>

    <!-- IDENTITY TRANSFORM -->
    <!-- REPLACE WITH YOUR HIGHER LEVEL TEMPLATES -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="language">
        <!-- BUILD SPACES CONDITIONAL ON LENGTH OF TEXT -->
        <!-- REPLACE text() YOUR substring(concat (...)) WITHOUT YOUR LONG $spaces) -->
        <xsl:variable name="spaces">
              <xsl:call-template name="repeat">
                <xsl:with-param name="spaces" select="string-length(text())"/>
              </xsl:call-template>
        </xsl:variable>
        <xsl:copy>
            <!-- PAD TEXT WITH SPACES -->
            <xsl:value-of select="concat(text(), $spaces)"/>
        </xsl:copy>
    </xsl:template>    

    <!-- RECURSIVE TEMPLATE -->
    <xsl:template name="repeat">
        <xsl:param name="spaces"/>
        <xsl:param name="n"><xsl:value-of select="$spaces"/></xsl:param>

        <!-- REPLACE 10 FOR YOUR 300 -->
        <xsl:if test="$n &lt;= 10">
            <!-- recursive call -->
            <xsl:call-template name="repeat">
                <xsl:with-param name="n" select="$n + 1" />
            </xsl:call-template> 
            <!-- REPLACE WITH ANY TEXT VALUE TO BE REPEATED -->      
            <xsl:text>&#x20;</xsl:text>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

Вывод

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <languages type="special purpose">
        <language>xslt      </language>
        <language>sql       </language>
        <language>css       </language>
    </languages>
    <languages type="general purpose">
        <language>python    </language>
        <language>java      </language>
        <language>c#        </language>
    </languages>
</root>

XSLT Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...