我有一个需要实现以下逻辑的要求:
我们需要在前缀中添加前导空格,并确保其始终为6。 我们需要在base中添加前导空格,并确保始终为8。 我们需要在后缀中添加尾随空格,并确保其始终为8。
我使用了填充字符串,但是只能实现尾随空格的添加。 请帮忙。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:func="myfunc"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions" >
<xsl:function name="func:padStr">
<xsl:param name="str"/>
<xsl:param name="chr"/>
<xsl:param name="len"/>
<xsl:variable name="pad">
<xsl:for-each select="1 to $len">
<xsl:value-of select="$chr" />
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring(concat($str,$pad),1,$len)"/>
</xsl:function>
<xsl:output method="text" encoding="utf-8" />
<xsl:output omit-xml-declaration="yes" />
<xsl:param name="break" select="' '" />
<xsl:template match="/">
<xsl:variable name="Prefix" select="A/W1"/>
<xsl:variable name="Base" select="A/W2"/>
<xsl:variable name="Suffix" select="A/W3"/>
<xsl:value-of select="func:padStr($Prefix,' ',6)"/>
<xsl:value-of select="func:padStr($Base,' ',8)"/>
<xsl:value-of select="func:padStr($Suffix,' ',8)"/>
</xsl:template>
</xsl:stylesheet>
输入:
<A>
<W1>9876</W1>
<W2>gt465</W2>
<W3>fr</W3>
</A>
预期输出:
'9876 gt465fr'
在此前缀中为4,然后是2个空格,以5为基数,所以3个空格,后缀为2,然后添加6个空格。.它可能有所不同。
答案 0 :(得分:2)
您当前的功能仅执行右填充,因此您需要一个新功能来进行左填充
<xsl:function name="func:padStrLeft">
<xsl:param name="str"/>
<xsl:param name="chr"/>
<xsl:param name="len"/>
<xsl:variable name="pad">
<xsl:for-each select="1 to $len">
<xsl:value-of select="$chr" />
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring(concat($pad, $str), string-length($str) + 1)"/>
</xsl:function>
或者,要在一个函数中执行此操作,请添加一个新参数以指示是否要右填充
<xsl:function name="func:padStr">
<xsl:param name="str"/>
<xsl:param name="chr"/>
<xsl:param name="len"/>
<xsl:param name="rightpad" />
<xsl:variable name="pad">
<xsl:for-each select="1 to $len">
<xsl:value-of select="$chr" />
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="if ($rightpad)
then substring(concat($str,$pad),1,$len)
else substring(concat($pad, $str), string-length($str) + 1)"/>
</xsl:function>
然后这样称呼它:
<xsl:value-of select="func:padStr($Prefix,' ',6,false())"/>
<xsl:value-of select="func:padStr($Base,' ',8,false())"/>
<xsl:value-of select="func:padStr($Suffix,' ',8,true())"/>