1
votes

Ajouter de l'espace à une valeur xml à l'aide de XSLT

J'ai une valeur XML comme celle-ci comme fichier d'entrée:

1234 5678

Je veux que les chiffres soient formatés et traités comme: 1234 5678

Comment puis-je ajouter des espaces pour chaque valeur de champ? Digit1 et Digit2 ont une longueur fixe qui est 8. Si la valeur est uny 4, ajoutez-y des espaces. Digit1 est à gauche et digit2 est à droite.

J'ai quelque chose comme ça mais ne fonctionne pas

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

merci beaucoup


5 commentaires

Il existe xsltfunctions.com/xsl/functx_pad-string-to-length. html , par exemple. Si vous avez écrit du code pour PadRight ou PadLeft et qu'il n'obtient pas ce que vous voulez, alors montrez-nous des exemples minimes mais complets avec une description exacte de l'erreur ou le résultat actuel. Nous ne pouvons pas corriger une fonction PadRight où vous n'affichez pas le code.


Veuillez préciser quelle version de XSLT est nécessaire. Le balisage avec les trois versions n'est pas utile.


@MichaelKay xslt2 ou 3 merci :)


@MartinHonnen voici la pièce manquante: < xsl: value-of select = "substring ($ LeftPadding, 1, $ length - string-length (string ($ string)))" />


@MartinHonnen


4 Réponses :


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

0 commentaires

0
votes

Le moyen le plus simple de compléter à la largeur 8 à droite est

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

et à gauche:

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


1 commentaires

Cette réponse est incorrecte dans sa 2ème partie - voir la démo ici: xsltfiddle.liberty-development.net/94AcskP / 1



0
votes

Le principal problème concernant le code que vous avez publié semble être que vous n'avez pas mis vos fonctions dans un espace de noms, qui est requis pour les fonctions définies par l'utilisateur; avec un peu de nettoyage pour utiliser des déclarations de type ( as = "sequence-type" ) et pour utiliser xsl: sequence pour renvoyer des chaînes et non des nœuds de texte, votre code devient

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

De cette façon à https://xsltfiddle.liberty-development.net/jz1Q1xW il semble faire le travail.


0 commentaires

0
votes

J'utiliserais une seule fonction avec la possibilité de sélectionner la direction de l'alignement (ainsi que la longueur fixe et le caractère de remplissage) comme paramètre:

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

Démo : https://xsltfiddle.liberty-development.net/94AcskP

p>


0 commentaires