У меня есть спецификация текстового файла с фиксированной шириной, которая имеет сотни потенциальных полей.Я хочу добавить около 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) < $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>
Я хочу иметь возможность указывать конкретные поля начальных и конечных позиций.