如何使用“ func:padStr添加前导空格

时间:2019-06-07 14:14:56

标签: xslt xslt-2.0

我有一个需要实现以下逻辑的要求:

我们需要在前缀中添加前导空格,并确保其始终为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="'&#13;&#10;'" />



    <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个空格。.它可能有所不同。

1 个答案:

答案 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())"/>
相关问题