使用 XSLT 将 space 添加到 xml 值

Add space to an xml value using XSLT

我有一个像这样的 xml 值作为输入文件:

<digit1>1234</digit> <digit2>5678</digit2>

我希望像这样格式化和处理数字: <digit1>1234 </digit> <digit2> 5678</digit2>

如何为每个字段值添加空格? Digit1 和Digit2 的长度固定为8。如果值为4,则为其添加空格。 Digit1 左对齐,digit2 右对齐。

我有类似的东西但没有用

<xsl:variable name="RightPadding" select="' '"/> <xsl:variable name="LeftPadding" select="' '"/>

<!-- Function to left-pad (right justify) -->
<xsl:function name="PadLeft">
    <xsl:param name="string"/>
    <xsl:param name="length"/>
    <xsl:variable name="leftPad">
        <xsl:value-of select="substring($LeftPadding,1,$length - string-length(string($string)))"/>
    </xsl:variable>
    <xsl:value-of select="concat($leftPad, $string)"/>
</xsl:function>

<!-- Function to right-pad (left justify) -->
<xsl:function name="PadRight">
    <xsl:param name="string"/>
    <xsl:param name="length"/>
    <xsl:value-of select="substring(concat($string,$RightPadding),1,$length)"/>
</xsl:function>  

<xsl:value-of select="PadRight(digit1,8)"/></Invoice_No> <xsl:value-of select="PadLeft(digit2,8)"/></Gross_Amount>

非常感谢

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template name="leftPadding">
    <xsl:param name="value"/>
    <xsl:value-of select="substring(concat('        ', $value), string-length($value)+1)"/>
</xsl:template>

<xsl:template name="rightPadding">
    <xsl:param name="value"/>
    <xsl:value-of select="substring(concat($value, '        '), 1,8)"/>
</xsl:template>

<xsl:template match="/">
<xsl:variable name="valueWithLeftPadding">
  <xsl:call-template name="leftPadding">
    <xsl:with-param name="value" select="/root/digit1"/>
  </xsl:call-template>
</xsl:variable>
<xsl:variable name="valueWithRightPadding">
  <xsl:call-template name="rightPadding">
    <xsl:with-param name="value" select="/root/digit2"/>
  </xsl:call-template>
</xsl:variable>
<result>
<digit1><xsl:value-of select="$valueWithLeftPadding"/></digit1>
<digit2><xsl:value-of select="$valueWithRightPadding"/></digit2>
</result>
</xsl:template>
</xsl:stylesheet>

输入:

<root>
<digit1>abcdef</digit1>
<digit2>abcdef</digit2>
</root>

结果:

<?xml version="1.0" encoding="UTF-8"?><result>
<digit1>  abcdef</digit1>
<digit2>abcdef  </digit2>
</result>

在右侧填充到宽度 8 的最简单方法是

substring(concat(X, '                '), 1, 8)

和左边:

substring(concat('              ', X), 8 - string-length(X))

关于您发布的代码的主要问题似乎是您没有将您的函数放在命名空间中,这是用户定义函数所必需的;通过一些清理以使用类型声明 (as="sequence-type") 并使用 xsl:sequence 到 return 字符串而不是文本节点,您的代码将变为

  <xsl:param name="RightPadding" select="'        '"/>
  <xsl:param name="LeftPadding" select="'        '"/>

  <!-- Function to left-pad (right justify) -->
  <xsl:function name="mf:PadLeft" as="xs:string">
    <xsl:param name="string" as="xs:string"/>
    <xsl:param name="length" as="xs:integer"/>
    <xsl:variable name="leftPad" 
      select="substring($LeftPadding,1,$length - string-length($string))"/>
    <xsl:sequence select="concat($leftPad, $string)"/>
  </xsl:function>

  <!-- Function to right-pad (left justify) -->
  <xsl:function name="mf:PadRight" as="xs:string">
    <xsl:param name="string" as="xs:string"/>
    <xsl:param name="length" as="xs:integer"/>
    <xsl:sequence select="substring(concat($string,$RightPadding),1,$length)"/>
  </xsl:function>

https://xsltfiddle.liberty-development.net/jz1Q1xW 这样似乎可以完成工作。

我会使用一个能够select对齐方向(以及固定长度和填充字符)作为参数的函数:

<xsl:function name="my:pad-to-fixed-length">
    <xsl:param name="string"/>
    <xsl:param name="length"/>
    <xsl:param name="char"/>
    <xsl:param name="alignment"/>
    <xsl:variable name="padding" select="for $i in (1 to $length) return $char"/> 
    <xsl:choose>
        <xsl:when test="$alignment='left'">
            <xsl:value-of select="substring(string-join(($string, $padding)), 1, $length)"/>
        </xsl:when>
        <xsl:when test="$alignment='right'">
            <xsl:value-of select="substring(string-join(($padding, $string)), string-length($string) + 1)"/>
        </xsl:when>
    </xsl:choose>
</xsl:function>

演示:https://xsltfiddle.liberty-development.net/94AcskP