Могу ли я объединить функции XSLT?Начальная позиция и длина поля? - PullRequest
0 голосов
/ 17 мая 2019

У меня есть спецификация текстового файла с фиксированной шириной, которая имеет сотни потенциальных полей.Я хочу добавить около 80 полей из исходного XML-файла, который я хочу пройти через мой XSLT, но мне нужно указать начальную и конечную позиции для каждого из полей, которые я хочу добавить.Может ли кто-нибудь помочь подтвердить, если это можно сделать?Могу ли я вызвать два шаблона XSLT?(один определяет длину поля, а другой определяет начальную позицию?) Могу ли я написать новую функцию для достижения желаемых результатов?Я не хочу определять каждое поле из спецификаций производителя, только те поля, которые я знаю, будут добавлены в файл.

  <xsl:call-template name="FormatFixedWidthString">
            <xsl:with-param name="stringValue">
                <xsl:value-of select="field4"/>
            </xsl:with-param>
            <xsl:with-param name="size">8</xsl:with-param>
            <xsl:with-param name="justify">left</xsl:with-param>
        </xsl:call-template>

 <!-- Format Fixed Width Text -->
<xsl:template name="FormatFixedWidthString">
    <xsl:param name="size"/>
    <xsl:param name="stringValue"/>
    <xsl:param name="justify"/>
    <xsl:if test="string-length($stringValue) > $size">
        <xsl:value-of select="substring($stringValue, 1, $size)"/>
    </xsl:if>
    <xsl:if test="string-length($stringValue) &lt; $size">
        <xsl:choose>
            <xsl:when test="$justify='left'">
                <xsl:call-template name="append-pad">
                    <xsl:with-param name="padChar">
                        <xsl:text> </xsl:text>
                    </xsl:with-param>
                    <xsl:with-param name="padVar">
                        <xsl:value-of select="$stringValue"/>
                    </xsl:with-param>
                    <xsl:with-param name="length">
                        <xsl:value-of select="$size"/>
                    </xsl:with-param>
                </xsl:call-template>
            </xsl:when>
            <xsl:when test="$justify='right'">
                <xsl:call-template name="prepend-pad">
                    <xsl:with-param name="padChar">
                        <xsl:text> </xsl:text>
                    </xsl:with-param>
                    <xsl:with-param name="padVar">
                        <xsl:value-of select="$stringValue"/>
                    </xsl:with-param>
                    <xsl:with-param name="length">
                        <xsl:value-of select="$size"/>
                    </xsl:with-param>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <!-- Output error message in case of misspelled "left" or "right" -->
                <xsl:call-template name="append-pad">
                    <xsl:with-param name="padChar">
                        <xsl:text> </xsl:text>
                    </xsl:with-param>
                    <xsl:with-param name="padVar">
                        <xsl:text>ERROR!</xsl:text>
                    </xsl:with-param>
                    <xsl:with-param name="length">
                        <xsl:value-of select="$size"/>
                    </xsl:with-param>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:if>
    <xsl:if test="string-length($stringValue)=$size">
        <xsl:value-of select="$stringValue"/>
    </xsl:if>
</xsl:template>

<!-- Append Padding Characters to Text -->
<xsl:template name="append-pad">
    <xsl:param name="padChar"/>
    <xsl:param name="padVar"/>
    <xsl:param name="length"/>
    <xsl:choose>
        <xsl:when test="string-length($padVar) &lt; $length">
            <xsl:call-template name="append-pad">
                <xsl:with-param name="padChar" select="$padChar"/>
                <xsl:with-param name="padVar" select="concat($padVar,$padChar)"/>
                <xsl:with-param name="length" select="$length"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="substring($padVar,1,$length)"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<!-- Prepend Padding Characters to Text -->
<xsl:template name="prepend-pad">
    <xsl:param name="padChar"/>
    <xsl:param name="padVar"/>
    <xsl:param name="length"/>
    <xsl:choose>
        <xsl:when test="string-length($padVar) &lt; $length">
            <xsl:call-template name="prepend-pad">
                <xsl:with-param name="padChar" select="$padChar"/>
                <xsl:with-param name="padVar" select="concat($padChar,$padVar)"/>
                <xsl:with-param name="length" select="$length"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="substring($padVar,string-length($padVar) - $length + 1)"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

Я хочу иметь возможность указывать конкретные поля начальных и конечных позиций.

...