Как использовать "func: padStr для добавления пробелов - PullRequest
0 голосов
/ 07 июня 2019

У меня есть требование, по которому мне нужно выполнить приведенную ниже логику:

Нам нужно добавить начальные пробелы в префиксе и убедиться, что оно всегда равно 6. Нам нужно добавить начальные пробелы в базе,и убедитесь, что он всегда равен 8. Нам нужно добавить конечные пробелы в суффиксе, и убедиться, что он всегда равен 8.

Я использовал строку pad, но только для добавления дополнительных пробелов.,Пожалуйста, помогите.

 <?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 Ответ

2 голосов
/ 07 июня 2019

Ваша текущая функция выполняет только правое заполнение, поэтому вам нужна новая функция для выполнения левого заполнения

<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())"/>
...