Добавьте пробел к значению xml, используя XSLT - PullRequest
1 голос
/ 17 января 2020

У меня есть xml значение, подобное этому, в качестве входного файла:

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

Я хочу, чтобы цифры были отформатированы и обработаны следующим образом: <digit1>1234 </digit> <digit2> 5678</digit2>

Как добавить пробелы для каждого значения поля? Digit1 и Digit2 имеют фиксированную длину, равную 8. Если значение равно только 4, добавьте к нему пробелы. Цифра 1 соответствует левому значению, а цифра 2 - по правому краю.

У меня есть что-то подобное, но не работает

<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>

большое спасибо

Ответы [ 4 ]

1 голос
/ 17 января 2020
<?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>
0 голосов
/ 20 января 2020

Я бы использовал одну функцию с возможностью выбрать направление выравнивания (а также фиксированную длину и символ заполнения) в качестве параметра:

<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

0 голосов
/ 18 января 2020

Основная проблема кода, который вы разместили, заключается в том, что вы не поместили свои функции в пространство имен, которое требуется для пользовательских функций; с некоторой очисткой для использования объявлений типов (as="sequence-type") и использования xsl:sequence для возврата строк, а не текстовых узлов ваш код становится

  <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 похоже, делает работу.

0 голосов
/ 17 января 2020

Самый простой способ дополнить ширину 8 справа - это

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

, а слева:

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