我可以结合使用XSLT功能吗?起始位置和字段长度?

时间:2019-05-17 19:10:02

标签: xslt-2.0

我有一个固定宽度的文本文件规范,其中包含数百个潜在字段。我希望从XML源文件中添加大约80个字段,这些字段要通过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>

我希望能够指定特定字段的开始和结束位置。

0 个答案:

没有答案