如何使用元素属性来定义值长度,将一些xml转换为固定长度的字符串


<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Destination>acme.com</Destination>
<Record>
<FirstField length="10">AAAA</FirstField>
<SecondField length="15">BBBB</SecondField>
<SubRecord>
<ThirdField length="20">CCCC</ThirdField>
<FourthField length="8">DDDD</FourthField>
</SubRecord>
</Record>
</Root>

嗨,我需要举一个xml示例,其中节点内的元素将是动态的&可以是几层深的,并创建一个固定长度的文本字符串,其中每个值都向左填充,使用一些xslt转换可以处理xml直到完成。每个值的长度都是在常量长度属性值中定义的,所以上面的例子在转换后是(在引号内,这样你就可以看到完整的字符串:

"      AAAA           BBBB                CCCC    DDDD"

我已经尝试过几次创建所需的xslt来转换它,但运气不太好,因为我对xslt了解不够。

是否有人能够提供可能有效的东西。需要在xsl 1.0中。

谢谢。

试试这个:

<xsl:variable name="spaces" select="'                                   '"/>
<xsl:template match="/">
<xsl:text>"</xsl:text>
<xsl:for-each select="//*[@length]">
<xsl:variable name="spacelenght" select="@length - string-length(.)"/>
<xsl:value-of select="concat(substring($spaces, 1, $spacelenght), .)"/>
</xsl:for-each>
<xsl:text>"</xsl:text>
</xsl:template>

输出

"      AAAA           BBBB                CCCC    DDDD"

请参阅上的转换https://xsltfiddle.liberty-development.net/6q1S8AC

对于您的最新问题

<?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"
exclude-result-prefixes="xs"
version="1.0">
<xsl:output method="text"/>
<xsl:variable name="spaces" select="'                                   '"/>

<xsl:template match="/">
<xsl:text>"</xsl:text>
<xsl:apply-templates/> 
<xsl:text>"</xsl:text>
</xsl:template>

<xsl:template match="node()" priority="-1">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="*[@Occurs]">
<xsl:variable name="data">
<xsl:apply-templates/>
</xsl:variable>
<xsl:call-template name="copy">
<xsl:with-param name="data" select="$data"/>
<xsl:with-param name="seq" select="0"/>
<xsl:with-param name="lastseq" select="number(@Occurs)"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="copy">
<xsl:param name="data"/>
<xsl:param name="seq"/>
<xsl:param name="lastseq"/>
<xsl:copy-of select="$data"></xsl:copy-of>
<xsl:if test="$seq &lt; $lastseq">
<xsl:call-template name="copy">
<xsl:with-param name="data" select="$data"/>
<xsl:with-param name="seq" select="$seq + 1"/>
<xsl:with-param name="lastseq" select="$lastseq"/>
</xsl:call-template>
</xsl:if>
</xsl:template>

<xsl:template match="*[@length]">
<xsl:variable name="spacelenght" select="@length - string-length(.)"/>
<xsl:value-of select="concat(substring($spaces, 1, $spacelenght), .)"/>
</xsl:template>

</xsl:stylesheet>

输出

"      AAAA           BBBB                CCCC    DDDD                CCCC    DDDD                CCCC    DDDD                CCCC    DDDD                CCCC    DDDD                CCCC    DDDD                CCCC    DDDD                CCCC    DDDD                CCCC    DDDD                CCCC    DDDD"

请参阅转换https://xsltfiddle.liberty-development.net/6q1S8AC/2

相关内容

  • 没有找到相关文章

最新更新