<?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 < $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