Xslt 如何检查xsl中的字符串长度,如果没有达到目标长度,则表示需要替换为空格

Xslt 如何检查xsl中的字符串长度,如果没有达到目标长度,则表示需要替换为空格,xslt,xslt-2.0,Xslt,Xslt 2.0,大家好 <Table> <COSTUMER_NAME>praveen</COSTUMER_NAME> </Table> 普拉文 praveen(字符串长度)=7 我们不知道客户名称的字符串长度有时可能小于35 或者确切地说是35 如果字符串长度小于35,则需要替换为剩余字符串长度部分以外的空间 输出:如果我以praveen的形式接收字符串 字符串长度为“7” 那么剩下的28个字符应该被替换为空格我认为这应该可以做到: <xsl:

大家好

<Table>
    <COSTUMER_NAME>praveen</COSTUMER_NAME>
</Table>

普拉文
praveen(字符串长度)=7

我们不知道客户名称的字符串长度有时可能小于35 或者确切地说是35

如果字符串长度小于35,则需要替换为剩余字符串长度部分以外的空间

输出:如果我以praveen的形式接收字符串

字符串长度为“7


那么剩下的28个字符应该被替换为空格

我认为这应该可以做到:

<xsl:template match="/">
    <xsl:variable name="CUSTOMER_NAME">thestring</xsl:variable>
    <xsl:value-of 
         select="substring(
                    concat(
                       $CUSTOMER_NAME,
                       '                                   '
                    ),
                    1,
                    35
                 )"/>
</xsl:template>

这里有35个空格字符作为concat函数的参数。因此,它将字符串和35个空格字符连接在一起,然后从其中的前35个字符中提取一个子字符串,因此额外的空白将丢失

XSLT 2.0解决方案

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:my="my:my" >
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  '<xsl:sequence select=
   "my:pad(/*/*, 35, ' ')"/>'
 </xsl:template>

 <xsl:function name="my:pad" as="xs:string">
  <xsl:param name="pString" as="xs:string"/>
  <xsl:param name="pLength" as="xs:integer"/>
  <xsl:param name="pPadChar" as="xs:string"/>

  <xsl:sequence select=
   "concat($pString,
           string-join(
                   for $i in 1 to $pLength - string-length($pString)
                    return $pPadChar
                    ,
                    ''
                    )
           )
   "/>
 </xsl:function>
</xsl:stylesheet>
<Table>
    <COSTUMER_NAME>praveen</COSTUMER_NAME>
</Table>
  'praveen                            '
注意事项

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:my="my:my" >
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  '<xsl:sequence select=
   "my:pad(/*/*, 35, ' ')"/>'
 </xsl:template>

 <xsl:function name="my:pad" as="xs:string">
  <xsl:param name="pString" as="xs:string"/>
  <xsl:param name="pLength" as="xs:integer"/>
  <xsl:param name="pPadChar" as="xs:string"/>

  <xsl:sequence select=
   "concat($pString,
           string-join(
                   for $i in 1 to $pLength - string-length($pString)
                    return $pPadChar
                    ,
                    ''
                    )
           )
   "/>
 </xsl:function>
</xsl:stylesheet>
<Table>
    <COSTUMER_NAME>praveen</COSTUMER_NAME>
</Table>
  'praveen                            '
  • 被使用
    ,这确保了完全的可重用性

  • 完全参数化为我们提供了最通用、最适用和最可重用的解决方案

  • 这样的函数可以用几乎完全相同的方式定义,如XQuery中的,或纯XPath 3.0中的函数项


  • 请注意,如果名称超过38个字符,则客户名称的结尾也会丢失。问得好,+1。请参阅我的asnswer,了解一个简短、简单、最通用和可重用的XSLT2.0解决方案。