我有一个固定宽度的文本文件规范,其中包含数百个潜在字段。我希望从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) < $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) < $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) < $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>
我希望能够指定特定字段的开始和结束位置。